3

我一直在为我的一个小宠物项目使用可序列化接口有一段时间了,我经常注意到一个关于我应该如何定义 static final long 的警告serialVersionID

我一直在寻找一种方法让我自己的接口产生类似的警告(强制/建议在任何实现它的类中声明一个常量),但到目前为止还没有找到任何东西。该Seralizable界面只是一个标记界面,因此它实际上不包含任何内容,而我最接近回答我的问题的是在 dreamincode 上的这个线程

任何人都可以提供帮助,因为这听起来像是一个非常有用的功能?

4

2 回答 2

0

最简单的方法是简单地声明一个值。就像是:

private static final long serialVersionUID = 1L;

这样做的原因是为了控制对象的序列化/反序列化。如果您序列化一个没有 的类的实例,serialVersionUID系统会从当前的类定义中生成一个。如果您以任何重要的方式更改类,系统生成的 id 将会改变。反过来,这将阻止您反序列化使用旧 id 序列化的对象。

如果您正在序列化对象但不持久化它们,那么定义 ID 可能是不必要的(除了摆脱编译器警告)。

有关更多信息,请参阅此线程

于 2013-03-17T05:35:59.307 回答
0

serialVersionID(a field)声明为Serializable接口的成员。字段名称只是一个约定,并且在运行时通过反射访问该字段。不能使用接口来定义字段契约。

警告是“编译器魔法”,它知道在遇到实现 Serializable 的类型但没有这样的字段时应该发出警告。此警告行为不能仅在应用程序代码中的其他字段中模拟 - 获得类似警告需要使用了解所需启发式的 [自定义] 编译器或 lint/代码检查器。

于 2013-03-17T05:40:01.827 回答