2010-09-21 141 views
3

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

如果使用类型MyClass的

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

}

一个对象被序列化到文件。

然后,我改变,其改变MyClass的定义

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

}

之后的代码,我反序列化从文件中的对象,以使用改变代码MyClass的对象。可以吗?反序列化过程中会抛出异常吗?我想重用旧对象。即我希望可以完成反序列化。所以我希望没有抛出异常。

谢谢。

+0

[管理序列化Java对象的多个版本。](http://stackoverflow.com/questions/3678136/managing-serveral-versions-of-serialized-java-objects) – Bozho 2010-09-21 05:01:42

回答

4

没有,相反,你会碰到很大的问题。在Joshua Bloch的Effective Java的第74条中,他注意到明智地实现了Serializable,因为它降低了一个类的实现一旦被释放的灵活性。

他特别指出:“如果你不做出设计自定义序列化形式的努力,而只是接受默认,序列化形式将永远绑在类的原始内部表示。”

2

这就是为什么你应该有一个的serialVersionUID。这两个版本会有所不同,你的代码会知道它不能完成,并停止反序列化。

+0

我想重用旧的目的。即我希望可以完成反序列化。这就是我将使用相同的serialVersionUID的原因。 – Kai 2010-09-21 01:21:16

+1

它会炸毁。您可以保留该类的旧版本,并用新名称创建新版本...然后让新版本使用构造函数将旧类的值映射到新类... – bwawok 2010-09-21 02:07:26

2

如果您删除对象的字段,然后旧的对象将不反序列化。这样做的方法是始终使用相同的serialVersionUID,并且永远不要删除字段,只添加它们。