4

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

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

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

谢谢

4

2 回答 2

2

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

为什么?如果您根本不提供这些方法,那将是默认操作。[虽然我不知道你所说的“获取一个输出流”到底是什么意思,除非你指的是作为参数提供的那个。]

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

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

在继续之前,您需要仔细阅读 Object Serialization Specification 的 Object Versioning 部分。序列化对类进化的支持比大多数人似乎意识到的要多得多,包括这个问题的其他受访者以及他们所链接的问题。

于 2012-12-12T00:54:07.747 回答
0

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

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

于 2012-12-12T00:00:51.703 回答