类字段更改时的对象序列化和反序列化

时间:2010-09-21 00:31:48

标签: java

当类字段发生变化时,我有一个关于对象序列化和反序列化的问题。

如果是MyClass类型的对象

MyClass {
    String str1;
    LinkedList mylist = new LinkedList();
    String str2;

}

已被序列化为档案。

然后我更改了将MyClass定义更改为

的代码
MyClass {
    String str1;
    LinkedList mylist = new LinkedList();
    Map myMap = new HashMap();

}

之后,我使用更改的代码将对象从文件反序列化为MyClass对象。可以吗?在反序列化期间是否会抛出任何异常?我想重用旧的对象。即我希望可以完成反序列化。所以我希望不会抛出异常。

感谢。

3 个答案:

答案 0 :(得分:4)

不,相反,你会遇到很大问题。在Joshua Bloch的Effective Java,第74项中,他注意到明智地实现了Serializable,因为它降低了在类的实现发布后更改类的实现的灵活性。

他特别指出“如果你没有努力设计一个自定义的可序列化表单,但只是接受默认值,那么序列化表单将永远与该类的原始内部表示相关联。”

答案 1 :(得分:2)

这就是你应该拥有serialVersionUID的原因。两个版本之间会有所不同,您的代码会知道无法完成,并停止反序列化。

答案 2 :(得分:2)

如果从对象中删除字段,则旧对象不会反序列化。这样做的方法是始终使用相同的serialVersionUID,永远不删除字段,只添加它们。