繁体   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