我正在創建一個Serializable對象描述符,它將存儲非Serailizable實體的重要狀態數據。如何保持舊的描述符在應用程序升級之間有效?我正在考慮打開所有已知的以前的狀態(升級時),並提示各州自行升級。也許通過:如何維護序列化對象?
void onUpgrade(int oldVersion, int newVersion, int updateFlags);
,但我不知道這是序列化的維護良好的方法。
我正在創建一個Serializable對象描述符,它將存儲非Serailizable實體的重要狀態數據。如何保持舊的描述符在應用程序升級之間有效?我正在考慮打開所有已知的以前的狀態(升級時),並提示各州自行升級。也許通過:如何維護序列化對象?
void onUpgrade(int oldVersion, int newVersion, int updateFlags);
,但我不知道這是序列化的維護良好的方法。
我建議另一種形式的外部表現形式。序列化對象難以保持兼容性,因爲您已經注意到了。最簡單的做法是用jaxb註釋標註對象,然後使用Jaxb讀/寫它。
對象版本的困難通常過分誇大。偉大的事情是開始正確的知道你能做什麼,不能做什麼。必須在對象序列化規範的對象版本部分的規則真的很好看,跟隨他們宗教:
如果這還不夠,請準備使用writeReplace()/ readResolve()機制和/或serializableFields機制。
什麼是writeReplace()/ readResolve()機制?我以前沒有用過它。 – AedonEtLIRA
@AedonEtLIRA它所有在[對象序列化規範]中描述的(http://docs.oracle.com/javase/6/docs/platform/serialization/spec/serialTOC.html),你應該從頭讀到以覆蓋,當然不包括協議附錄。但是,如果你不得不走得更遠,那麼你做錯了什麼,更不用說JavaWorld文章中描述的異常捕捉惡意軟件了,這隻能由瘋子嘗試。 – EJP
這裏有系列化一個偉大的文章:http://www.javaworld.com/javaworld/jw-02-2006/jw-0227-control.html,你追求什麼是第5頁上,並會涉及受涼InvalidClassException並處理例外。其他方法將涉及使用具有元數據的動態數據和結構,例如JSON,XML甚至描述符表,以便保持對變更的控制。希望有所幫助。 – eduardohl
@eduardohl這實際上幫了很多。感謝您的鏈接,相當有教育意義,如果有人願意抓取一點。 – AedonEtLIRA
該文章中存在嚴重的錯誤:例如,有關IllegalArgumentException對字段刪除的聲明是完全幻想。有一個更好的Sun文章的地方,基本上說,永遠不會改變serialVersionUID,永遠不會做出不兼容的變化。 – EJP