在java中序列化

时间:2012-12-11 23:49:50

标签: java serialization

我们的代码中有一个实现Serializable的java类。它已经在类中定义了serialVersionUUId。除此之外,我们还有另一个

static final String sVersion是一个整数。该类实现了readObject和writeObject api。在readObject API中,它使用InputStream填充所有成员变量,在writeObject API中,它获取OutputStream并调用writeObject方法。

现在我需要添加一个布尔数组作为此类的属性。我应该更改serialVersionUUID吗?如果我更改/不更改版本ID会产生什么影响? 什么是最佳实践?我试图通过joshua bloch进入有效的java,但需要一个快速易于消化的答案。

由于

2 个答案:

答案 0 :(得分:2)

  

该类实现了readObject和writeObject api。在readObject API中,它使用InputStream填充所有成员变量,在writeObject API中,它获取OutputStream并调用writeObject方法。

为什么呢?如果您根本不提供这些方法,则这是默认操作。 [虽然我不知道'获取一个OutputStream`究竟是什么意思,除非你指的是作为参数提供的那个。]

但是现在你在这里,你在readObject()所要做的就是尝试读取新字段并捕获抛出的异常(如果它们不在那里(OptionalDataException?),并在writeObject()写出额外的字段。

不要更改serialVersionUID 您应该探索序列化的广泛对象版本控制支持,(a)确保该类确实是现在序列化不兼容,根据规范很难实现; (b)尝试一个方案,如自定义read / writeObject()方法,readResolve / writeReplace()方法,serializableFields声明等,以确保流保持兼容。更改实际的serialVersionUID是最后的手段,绝望的忠告。

在继续进行之前,您需要非常好地了解Object Versioning section of the Object Serialization Specification。与大多数人似乎都知道的相比,序列化对课堂进化有更多的支持,包括这个问题的其他受访者以及他们所关联的问题。

答案 1 :(得分:0)

如果您可能最终尝试反序列化该类的不兼容实例,那么是的,您肯定应该更新serialVersionUID。另一方面,如果您的程序始终序列化和反序列化数据而不将其保存到持久存储,或者仍然可以保证您的类与其调用者之间的合同,那么您不需要更改serialVersionUID。

有关详细信息,请参阅https://stackoverflow.com/a/286254/44737https://stackoverflow.com/a/285827/44737