具有成员变量类型的向后兼容性问题的Java序列化更改

时间:2017-03-15 13:52:09

标签: java serialization deserialization

我有一个带有成员变量的序列化类,这是写入文件的,即文件中的每个记录都代表这个类。之后,根据新要求,会更改成员变量类型之一,并且在写入新文件时可以正常工作。但是,当我尝试读取旧文件(在此更改之前写入的文件)时,它会抛出ClasscastException,说“无法将旧数据类型成员分配给新数据”。 例如: 我的班级结构是:

 Public class MyClass implements Serializable
 {
    Date m_date;
    String m_name;
 }

因此,这代表文件中的一条记录。 然后,根据新的要求,我将“m_date”变量数据类型从Date更改为Custom类型(Custom Class,假设ABC也可序列化),因此类结构现在变为:

Public class MyClass implements Serializable
{
   ABC m_date;
   String m_name;
}

所以,我在这里遇到的问题是,当我尝试读取具有Date和String类型的每个记录的旧文件时,它会在这行代码上抛出异常:

while ( ( record = inputStream.readObject() ) != null )

因此,它清楚地表明,在阅读记录时,它无法将日期类型分配给不兼容的ABC类型。

我的问题是:如何确保在阅读旧文件时,我能够将日期类型更新为ABC并返回更新的记录,因此更新记录将具有ABC和String类型的值?

注意:我已经有了将日期类型更改为ABC的逻辑。

请用编码示例提供/指导我的解决方案。

〜感谢。

1 个答案:

答案 0 :(得分:0)

你别无选择。您必须将类更改回原始定义。然后,我将添加新的ABC类型作为具有新名称的新数据成员。或者,您可以提供将旧m_date成员映射到新ABC数据类型的getter和setter。

如果您有现有的序列化,如果您希望继续能够读取,则无法对该类执行序列化不兼容的更改,并且更改非静态非瞬态成员字段的类型是不兼容的更改。请参阅Java序列化规范的对象版本控制章节。