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



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

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

因此,这代表文件中的一个记录。然后,根据新要求,我已将" m_date"变量数据类型从日期更改为自定义类型(自定义类,也可以说也是可序列化的),因此类结构已成为现在:

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

所以,我在这里遇到的问题是,当我尝试读取具有每个类型日期和字符串记录的旧文件时,它会在这条代码上引发异常:

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

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

我的问题是:如何确保在阅读旧文件时,我可以更新到ABC的类型日期并返回更新的记录,因此更新记录将具有ABC类型和字符串的值?

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

请提供/指导我的解决方案。

〜谢谢。

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

有现有的序列化后,如果您想继续能够读取该序列化,则无法对类别进行序列化的更改,而更改非静态非透视成员字段的类型是不兼容的更改。请参阅Java序列化规范的对象版本控制章节。

最新更新