how to remove the warning The serializable class ClASSNAME does not declare a static final serialVersionUID field of type long
我创建了一个扩展Exception类的类,在Eclipse上得到了这个警告
The serializable class PhoneAlreadyExists does not declare a static
final serialVersionUID field of type long
请怎么取?
1 2 3 4 5 6 7 8 9 10 11
| public class PhoneAlreadyExists extends Exception {
public PhoneAlreadyExists () {
// TODO Auto-generated constructor stub
super();
}
PhoneAlreadyExists (String message ) {
super(message );
}
} |
- 向类中添加一个serialVersionUID字段。
- 这只是一个警告,不会造成任何碰撞。如果它真的困扰着你,你可以通过将鼠标悬停在警告上方并单击第一个建议(或者任何一个建议都可以抑制它)来抑制它。
- ctrl-1和quickfix
- 看看下面我的答案。这可能会有所帮助。
- 还有这个,这个,这个,还有这个等等的复制品。
要改变Eclipse全局中的行为:转到首选项> Java>编译器>错误/警告>潜在的编程问题。这个特定问题有一个条目。您也可以为特定的项目更改它。
这回答了你的问题,不过-我建议把它保留在警告级别,并添加缺少的字段。或者将SuppressWarnings注释添加到那些确实不需要字段的可序列化类中,因为它们永远不会被序列化。
- 谢谢。实际上它是首选项--> java>编译器>错误/警告>潜在的编程问题
- 感谢您的纠正!我已经用正确的路径更新了我的答案。
- 有趣的是,最有用/最切题的答案总是落在后面,你的答案应该是公认的答案。
- 请注意,从某个可序列化类型派生匿名类型时会收到此警告,即使父类型有自己的@suppresswarnings("serial")!!!)例如,当使用guava的typetoken时。(Eclipse4.4.2.)我想我可以为新匿名类型的站点添加注释…但这是一个皮塔,我宁愿把这个几乎无用的警告完全关掉。
- 不要仅仅忽略警告。在99%的情况下,他们正确地警告你一个问题。而是解决根本原因。
- @AnonyMousse通常我同意你的观点,但是除非你对异常进行序列化,通过rmi/corba发送它们或者将它们存储到磁盘,否则大多数人在大多数域中不会遇到异常序列化问题。如果你在一个你会受到影响的领域,你应该知道。99%的人不会在他们的网络应用程序中看到问题。这就是为什么可以全局地为一个项目禁用它。太糟糕了,没有像Java那样的全局可用的修复程序,比如EDCOX1 4。
- @齐奥弗伦:只要加上序列号就行了。这一点也不难(在Eclipse中按ctrl+1)。这实际上是一个适当的警告解决方案,而不是忽略原因。为什么在存在一次性自动生成修复时忽略?
在类上添加注释@SuppressWarnings("serial"),以忽略该警告。
- 或者只是正确地解决警告。它通常比忽略它要好,即使它是4行代码(当然包括javadoc,否则它只是1行)
- 当然,但通常我们不需要定义串行版本,因此这是解决问题的快速方法。
- 不是很快。Java IDE可以使用"快速修复"函数生成串行版本字段。例如Eclipse。
- 很好的建议,我还没有尝试过快速修复:)
- 有人喜欢这个吗?我想知道是否还有其他类型的"串行"警告可能被抑制,或者这是唯一的情况。
- @AnonyMousse每行代码都代表意图。如果您不希望对象被序列化,并且您添加了相反的代码来支持,那么您正在编写不连贯的代码。如果我们坚持所有可能的"三行代码"更改,您的代码的有意部分将最终成为实际代码的少数,这是危险的,如果您想写代码,您希望能够回来以后。它是编译器的、脆弱的基类,而typeclass的职责是为您的类(而不是您的特定类本身)添加样式。
- @dmitry如果您不希望类是可序列化的,那么就不要实现Serializable接口!导致不一致的不是serialVersionUID字段,也不会忽略问题解决它。当类定义更改时,此字段所做的一切都有助于识别反序列化问题。添加它不会"启用"序列化,忽略警告不会阻止序列化。
- @AnonyMousse正如最初的海报所指出的那样,当您扩展一个可序列化的类(这是您无法控制的)时,就会发生这种麻烦。如果程序员确信不会序列化任何PhoneAlreadyExists实例,那么@SuppressWarnings注释完全合适。
- 与让您的IDE生成一个序列相比,它什么也没有得到。它不会被检测为错误-类仍将实现可序列化。
需要声明long类型的静态final serialversionID字段。
查找Java的EDCOX1×0 API。异常必须实现Serializable,Serializable类必须具有serialVersionUID:
1
| public static final long serialVersionUID = 1L; |
每当对类进行不兼容的更改时,请增加此版本。
要忽略警告"可序列化类类名没有声明静态的最终serialversionuid……",请在eclipse*内执行以下操作:
单击Windows首选项Java编译器错误/警告
点击"潜在编程问题"
向下滚动到"没有serialversionID的可序列化类"
选择"忽略"
单击应用
单击确定
保存并关闭Eclipse IDE当您重新打开Eclipse时,这些特定的警告将不再列出。
*对于这个示例解决方案,我使用Eclipse IDE为Java开发人员——版本:MAR.2版本(4.5.2)
在大多数情况下,最好添加serialversionID,但是Eclipse会对所有Swing派生类发出警告,这些类永远不会被序列化。我试着在偏爱下改变设置-> java>编译器>错误/警告>潜在的编程问题,但是它没有效果。所以我想最好的解决方案是在每个类上禁止永远不会序列化的警告;或者咬紧牙关忽略警告。
只需将此代码@suppresswarnings("serial")添加到公共类phoneAlreadyExists扩展异常行