2012-07-20 34 views
1

我的组织使用自定义序列化技术,我们使用输出流迭代地存储对象。我遇到以下问题:保持向后兼容性的多继承序列化

ParentChild类实现SerializableParent班有字段a,b,cChild班有e。我将字段d添加到Parent并更新了父级的序列化,现在我们的旧客户端无法正确读取Child序列化代码。这是因为Child序列码云:

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阅读器不能照顾这。我对这个问题有一个丑陋的解决方案,但是它不会很好地延伸,所以我不想通过介绍它来污染读者的思想。不过,我真的很想听听其他人会如何处理类似的情况。

+1

您是否维护一个串行版本并在进行更改时进行更新? – 2012-07-20 19:23:09

+0

是的,序列版本已更新,但客户端的工具未更新。所以,它期望读取Field e,但是它接收包含d的字节流,然后e。 – Sal 2012-07-20 19:28:14

回答

1

旧父对象创建的对象被旧serialVersionUID序列化。新的对象被新的serialVersionUID序列化。 你正在实现的方式是,Child无法同时读取旧对象以及新对象。

您必须具有相同的serialVersionUID。如果编译器抱怨放置压制注释。你想清楚地沟通编译器它是同一个对象。

1

好的,看到多数民众赞成在这个问题。我知道你使用这个类来序列化你的数据,但是,这是一个类def。问题不是序列化问题。你已经构建了你的类来以特定的方式读取文件,现在你正在构造不同的文件。它不会“序列化”,因为它不再是同一类型的文件。如果你说:我用一个然后b和c字段创建一个文件,这个类将在第一个字段中读作a和第二个作为b等等,然后改变文件用b,c和a来创建。老班级仍然会认为'a'是第一位的,没有理由不应该这样做。