【发布时间】:2011-11-12 10:52:44
【问题描述】:
Java 编译器如何警告您未声明 serialVersionUID uid 字段?有没有一种方法可以为自定义界面做到这一点,或者那是 java 语言的魔法吗?
编辑:
我的问题不是关于可序列化接口,我明白这一点。但是它是如何产生警告的呢?我想实现同样的事情(如果实现我的接口的类不提供某个属性,则发出警告),但我没有看到任何关于可序列化的内容。
【问题讨论】:
标签: java interface serializable
Java 编译器如何警告您未声明 serialVersionUID uid 字段?有没有一种方法可以为自定义界面做到这一点,或者那是 java 语言的魔法吗?
编辑:
我的问题不是关于可序列化接口,我明白这一点。但是它是如何产生警告的呢?我想实现同样的事情(如果实现我的接口的类不提供某个属性,则发出警告),但我没有看到任何关于可序列化的内容。
【问题讨论】:
标签: java interface serializable
它不会警告你,它只会默默地为你生成serialVersionUID。然而,大多数 IDE 会针对没有此字段的 Serializable 类触发警告(出于某种原因)。
【讨论】:
正如其他答案所说,您正在寻找的警告高度特定于 Serializable。
一般来说,接口不能指定实现它的类中应该存在哪些字段。这实际上是基本的 OO 设计——字段是实现,而不是接口。
根据您的需要,也许在接口中有一个方法会更好,getTheField()。然后需要实现接口的类来实现该方法。他们可能会也可能不会通过使用私有字段来存储数据来这样做,但这似乎是一个内部实现细节,对调用者来说应该无关紧要。
【讨论】:
我不太确定你在问什么。这是 Serializable 接口的一个功能,我认为结合 Eclipse 的代码样式选项(或您正在使用的任何 IDE)会生成此警告。如果您检查代码样式选项(通常会在打开时给您一些警告,因此 IDE 可以帮助您保持代码清洁),我想您会找到生成此警告的选项。
如果您想知道,警告的目的是 serialVersionUID 用于唯一标识序列化对象。当您的代码尝试反序列化该对象(例如,从文件)时,如果您使用 Java 中的标准序列化技术,当您尝试反序列化的类的 serialVerionUID 时,JVM 将抛出错误, 与编译的类文件中的不匹配。这是 JVM 加载包含给定对象/数据结构的先前/替代版本的序列化对象的一种方式。
【讨论】: