只是一个简单的问题:
如果我在磁盘上保存了一个java对象,但之后又添加了一些数据成员(String类型),新类可以将这些旧的java对象读回那些新的String成员为null吗?
答案 0 :(得分:1)
这是可能的,但为此您需要主动管理兼容性。您需要确保新类具有与旧类相同的serialVersionUID
值。此private static final long serialVersionUID
字段可以自动生成 - 或手动分配。见http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html
如果您已经有serialVersionUID
,则新字段将为空。
如果您不想,则要创建一个并使用与旧类的自动生成值相同的值。那是工具serialver
的用途。
答案 1 :(得分:0)
新的String成员将是我认为的类定义中的默认值(或在默认构造函数中设置)。
您是否必须使用ObjectOutputStream / ObjectInputStream来序列化Java对象?这些都是“老派”。并写二进制(不是人类可读的格式)。这种格式保留了班级的实际结构(领域)知识。
如果你使用JSON进行序列化(或者技术上使用XML,但它会更大,更难处理),序列化的内容将会更加“面向未来”。将旧的JSON字符串读入Java时,如果它缺少较新版本的字段,则字段将保留其默认值。最重要的是,序列化数据将是人类可读的,并且可以使用任何现代IDE或网站轻松编辑,如:http://www.jsoneditoronline.org/
如果可以的话,尝试使用Java to JSON(和JSON to 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代码中定义的一样。