当类字段发生变化时,我有一个关于对象序列化和反序列化的问题。
如果是MyClass类型的对象
MyClass {
String str1;
LinkedList mylist = new LinkedList();
String str2;
}
已被序列化为档案。
然后我更改了将MyClass定义更改为
的代码MyClass {
String str1;
LinkedList mylist = new LinkedList();
Map myMap = new HashMap();
}
之后,我使用更改的代码将对象从文件反序列化为MyClass对象。可以吗?在反序列化期间是否会抛出任何异常?我想重用旧的对象。即我希望可以完成反序列化。所以我希望不会抛出异常。
感谢。
答案 0 :(得分:4)
不,相反,你会遇到很大问题。在Joshua Bloch的Effective Java,第74项中,他注意到明智地实现了Serializable,因为它降低了在类的实现发布后更改类的实现的灵活性。
他特别指出“如果你没有努力设计一个自定义的可序列化表单,但只是接受默认值,那么序列化表单将永远与该类的原始内部表示相关联。”
答案 1 :(得分:2)
这就是你应该拥有serialVersionUID的原因。两个版本之间会有所不同,您的代码会知道无法完成,并停止反序列化。
答案 2 :(得分:2)
如果从对象中删除字段,则旧对象不会反序列化。这样做的方法是始终使用相同的serialVersionUID,永远不删除字段,只添加它们。