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

Java序列化与成员变量类型更改的向后兼容性问题,java,serialization,deserialization,Java,Serialization,Deserialization,我有一个带有成员变量的serialize类,它正在写入文件,即文件中的每个记录都代表这个类。后来,根据新的要求,成员变量的一个类型被更改,并且可以很好地写入新文件。然而,当我试图读取旧文件(在这次更改之前编写的文件)时,它抛出ClasscastException,说“旧数据类型成员不能分配给新的数据类型成员”。 例如: 我的班级结构是: Public class MyClass implements Serializable { Date m_date; String m_n

我有一个带有成员变量的serialize类,它正在写入文件,即文件中的每个记录都代表这个类。后来,根据新的要求,成员变量的一个类型被更改,并且可以很好地写入新文件。然而,当我试图读取旧文件(在这次更改之前编写的文件)时,它抛出ClasscastException,说“旧数据类型成员不能分配给新的数据类型成员”。 例如: 我的班级结构是:

 Public class MyClass implements Serializable
 {
    Date m_date;
    String m_name;
 }
因此,这表示文件中的一条记录。 然后,根据新的需求,我将“m_date”变量数据类型从日期更改为自定义类型(自定义类,比如ABC,它也是可序列化的),因此类结构现在变为:

Public class MyClass implements Serializable
{
   ABC m_date;
   String m_name;
}
所以,我在这里面临的问题是,当我试图读取包含每个日期和字符串类型记录的旧文件时,它会在这行代码上抛出异常:

while ( ( record = inputStream.readObject() ) != null )
因此,它清楚地表明,在读取记录时,无法将日期类型分配给不兼容的ABC类型

我的问题是:如何确保在读取旧文件时,能够将类型日期更新为ABC并返回更新后的记录,以便更新记录将具有类型ABC和字符串的值

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

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


~z~谢谢。

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


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

您能检查一下吗?为什么需要在第一行中这样做?请阅读关于序列化的Javadocs,这里已经解释了所有内容。简言之,您需要检查serialVersionUID以查看数据序列化的版本,然后使用反序列化程序可以调用的特殊私有方法(
readResolve
)我必须读取旧文件,因为在某些情况下需要处理它,并且创建了新的自定义类来替换日期类型。但是,新旧文件的serialVersionUID定义为:private static final long serialVersionUID=1L;而且,在修改数据类型后,我没有收到任何与不兼容的串行版本id相关的错误。@RomaKhomyshyn您的链接都是不相关的,因为OP的类一开始是不可外部化的,而且质量很差。第一句话是不正确的,“标记对象”技巧是不必要的:他只需要
catch(OptionalDataException…
)。