只是一個簡單的問題:從新磁盤讀取序列化的java對象?
如果我保存在磁盤上的Java對象,但在那之後我增加了一些更多的數據成員(字符串型),可以將新類閱讀那些老的Java對象返回與新的String成員作爲空?
只是一個簡單的問題:從新磁盤讀取序列化的java對象?
如果我保存在磁盤上的Java對象,但在那之後我增加了一些更多的數據成員(字符串型),可以將新類閱讀那些老的Java對象返回與新的String成員作爲空?
這是可能的,但爲此您需要主動管理兼容性。您需要確保新班級與舊班級具有相同的serialVersionUID
值。此private static final long serialVersionUID
字段可以自動生成 - 或手動分配。請參閱http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html
如果您已有serialVersionUID
,則新字段將爲空。
如果您不這樣做,您希望創建一個並使用與舊類的自動生成值相同的值。這就是工具serialver
的用途。
新的String成員將是我相信的類定義中的默認值(或設置爲默認構造函數)。
您是否必須使用ObjectOutputStream/ObjectInputStream來序列化您的Java對象?那些是「老派」,並寫二進制(不是人類可讀的格式)。這種格式保留了班級的實際結構(現場)知識。
如果您使用JSON進行序列化(或技術上的XML,但它會更大和更難處理),序列化的內容將更加「面向未來」。在將舊的JSON字符串讀入Java中時,如果它缺少新類版本的字段,字段將保留其默認值。最重要的是,序列化的數據將是人類可讀的,並且可以用任何現代IDE或網站輕鬆編輯:http://www.jsoneditoronline.org/
如果可以,請嘗試Java到JSON(以及JSON到Java)的序列化庫,如json-io (https://github.com/jdereg/json-io)。只用一行代碼,就可以在Java對象圖轉化成JSON字符串:
String json = JsonWriter.objectToJson(root);
同樣,一行代碼,你可以看到這篇JSON回Java對象:
Object root = JsonReader.jsonToJava(json);
最後,使用JSON格式在Javascript中效果很好。如果一個web服務器返回一個帶有JSON內容的HTTP響應,這個內容將以Javascript對象的形式出現在Javascript開發人員的手中,這個對象是隨時可用的(JavaScript開發人員不需要編寫解析代碼)。這些對象是直接可讀的,就好像它們是在Javascript代碼中定義的一樣。
你是否明確地在原始對象中設置了'serialVersionUID'字段? –
是的,我喜歡。有一個生成,並且從未改變。 – huican
那麼是的,你所說的就是會發生什麼。然而,有一個問題 - 因爲它是如此簡單的事情,爲什麼你不只是試試它?_ :) –