簡體   English   中英

從磁盤讀取序列化的Java對象,使用較新的類?

[英]Read serialized java object from disk with newer class?

只是一個簡單的問題:

如果我在磁盤上保存了一個Java對象,但是之后又添加了一些數據成員(字符串類型),那么新類可以將那些新的String成員作為null讀回那些舊的Java對象嗎?

這是可能的,但是為此您需要主動管理兼容性。 您需要確保新類具有與舊類相同的serialVersionUID值。 private static final long serialVersionUID字段可以自動生成-或手動分配。 參見http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html

如果您已經有serialVersionUID ,則新字段將為null。

如果不這樣做,則要創建一個,並使用與舊類的自動生成的值相同的值。 這就是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完美配合。 如果網絡服務器返回帶有JSON內容的HTTP響應,則該內容將使其成為Java開發人員可以隨時使用的對象(Java開發人員不必編寫解析代碼)。 這些對象將是直接可讀的,就像它們是在Javascript代碼中定義的一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM