我有一个带有成员变量的序列化类,这是写入文件的,即文件中的每个记录都代表这个类。之后,根据新要求,会更改成员变量类型之一,并且在写入新文件时可以正常工作。但是,当我尝试读取旧文件(在此更改之前写入的文件)时,它会抛出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的逻辑。
请用编码示例提供/指导我的解决方案。
〜感谢。
答案 0 :(得分:0)
你别无选择。您必须将类更改回原始定义。然后,我将添加新的ABC
类型作为具有新名称的新数据成员。或者,您可以提供将旧m_date
成员映射到新ABC
数据类型的getter和setter。
如果您有现有的序列化,如果您希望继续能够读取,则无法对该类执行序列化不兼容的更改,并且更改非静态非瞬态成员字段的类型是不兼容的更改。请参阅Java序列化规范的对象版本控制章节。