我们的代码中有一个实现Serializable的java类。它已经在类中定义了serialVersionUUId。除此之外,我们还有另一个
static final String sVersion是一个整数。该类实现了readObject和writeObject api。在readObject API中,它使用InputStream填充所有成员变量,在writeObject API中,它获取OutputStream并调用writeObject方法。
现在我需要添加一个布尔数组作为此类的属性。我应该更改serialVersionUUID吗?如果我更改/不更改版本ID会产生什么影响? 什么是最佳实践?我试图通过joshua bloch进入有效的java,但需要一个快速易于消化的答案。
由于
答案 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/44737和https://stackoverflow.com/a/285827/44737。