Java 保持向后兼容性的多继承序列化

Java 保持向后兼容性的多继承序列化,java,inheritance,serialization,Java,Inheritance,Serialization,My org使用自定义序列化技术,我们使用输出流迭代存储对象。我遇到了以下问题: 父类和子类实现了可序列化父类类具有字段a、b、c,而子类类具有e。我将字段d添加到Parent并更新了Parent的序列化,现在我们的旧客户端无法正确读取子序列化代码。这是因为子序列化代码如下所示: OutputStream in = getCurrentOutStream(); current_serialization_num = readVersionNum(in) // The version num i

My org使用自定义序列化技术,我们使用输出流迭代存储对象。我遇到了以下问题:

父类
子类
实现了
可序列化
<代码>父类类具有字段
a、b、c
,而
子类
类具有
e
。我将字段
d
添加到
Parent
并更新了Parent的序列化,现在我们的旧客户端无法正确读取
序列化代码。这是因为
序列化代码如下所示:

OutputStream in = getCurrentOutStream();

current_serialization_num = readVersionNum(in) // The version num is similar to Java's UID and is updated when fields are added.
readParent(in)
e = readField(in)

由于序列化是通过
DataOutputStream
完成的,因此好的XML读取器无法处理这个问题。我对这个问题有一个丑陋的解决方案,但它不会很好地扩展,所以我不想通过介绍它来污染读者的头脑。然而,我真的很想听听其他的如何处理类似的情况。

由旧的父对象创建的对象被旧的serialVersionUID序列化。新对象由新的serialVersionUID序列化。 按照您的实现方式,Child不能同时读取旧对象和新对象


您必须具有相同的serialVersionUID。如果编译器抱怨,则放置一个抑制注释。如果是同一个对象,您需要清楚地与编译器进行通信。

好的,这就是问题所在。我知道您使用这个类来序列化数据,但是,这是一个类def。问题不是序列化问题。您已经构建了以特定方式读取文件的类,现在您正在以不同的方式构建文件。它不会“序列化”,因为它不再是同一类型的文件。如果你说:我用a,然后b,然后c字段创建一个文件,这个类将在第一个字段中读取a,第二个字段中读取b,等等。然后将文件更改为用b,c,然后a创建。旧类仍然认为“a”是第一个,没有理由不这样做。

您是否维护了串行版本,并在进行更改时进行更新?是的,串行版本已更新,但客户端的工具未更新。所以,它希望读取字段e,但它接收到一个包含d的字节流,然后是e。