klo*_*oop 5 java serialization
我有一个来自旧 Java 代码的对象,现在我更改了序列化对象代码。我希望能够读取旧文件和新文件。我需要在 readObject 中使用分支语句来执行以下操作:
if (next object is int -- just poking, it might be an Object)
{
// we know we are in version 1
} else {
// read new version of object
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
好吧,基本上问题是“我们如何检查下一个ObjectInputStream字段是基元还是对象?” 据我所知,答案是:你不能。
这意味着我能看到的保持向后兼容性的最佳解决方案是永远不要从原始版本中删除原语 - 保留无用的信息会稍微增大大小,但除此之外这很容易。
要添加新字段,我可以看到两种方法:
保持早期消息格式相同,仅在末尾添加新对象 - 然后您可以通过消息大小轻松区分不同版本(或者更准确地说,当您获取 v1 对象时读取 v2 数据时,您将收到 IOException)。这要简单得多,而且通常是首选。
您可以将对象从 v1 更改为 v2,然后进行简单的instanceof检查。如果要添加原语是存储它们的包装版本(即Integer等)。可以节省一些字节,但是 Java 的序列化协议从一开始就效率不高,所以实际上没有必要那么复杂。