我有一个应用程序以前通过序列化模型对象存储了一些数据(QuickNote
)。然后通过反序列化加载。如何将对象反序列化为具有相同名称的新对象?
不过,我更新的应用程序来存储XML数据,而不是和我需要能够导入旧的,序列化对象的转换。新对象不是实现Serializable
,虽然也有同名(QuickNote
)。
我试图反序列化老QuickNote
和使用后续的代码存储到新的一个:
FileInputStream fileIn = new FileInputStream("data/quicknotes_user.dat");
ObjectInputStream in = new ObjectInputStream(fileIn);
List<OldQuickNote> newList = (List<OldQuickNote>) in.readObject();
由于旧序列化文件中的类名是QuickNote
,我得到的错误java.io.InvalidClassException: model.QuickNote; class invalid for deserialization
因新的班级具有相同的名称并且不执行Serializable
。
有没有办法来反序列化这个QuickNote
对象为OldQuickNote
对象?无论QuickNote
和OldQuickNote
是相同的,只是QuickNote
不再实行Serializable
但OldQuickNote
一样。
我的确尝试寻找答案,但说实话,我甚至不知道如何搜索这个,因为当我选择首先序列化QuickNote
对象时,我显然做出了糟糕的设计决定。
注意事项:
- 我不能序列化对象改变对象类型(类名),因为它是目前驻留在用户的系统中。
- 新
QuickNote
对象不能改变,以实现Serializable
,因为它的注解和用于编组JAXB。
最简单的(只有?)解决方案是让它再次实现'Serializable'。 – Henry
我只是在我的问题中添加了一些警告。我不能用新对象实现'Serializable',因为JAXB编组似乎不允许它使用'Serializable'对象。 – Zephyr
欢迎来到Java对象序列化的世界 - 这些问题是我一般不推荐使用Java对象序列化的原因。 – Robert