【问题标题】:how to remove the warning The serializable class ClASSNAME does not declare a static final serialVersionUID field of type long [duplicate]如何删除警告可序列化类 ClassNAME 未声明 long 类型的静态最终 serialVersionUID 字段 [重复]
【发布时间】:2013-02-09 08:25:19
【问题描述】:

我创建了一个扩展 Exception 类的类,我在 Eclipse 上收到了这个警告

可序列化类 PhoneAlreadyExists 没有声明静态 long 类型的最终 serialVersionUID 字段

请问如何删除?

public class PhoneAlreadyExists extends Exception {
    public PhoneAlreadyExists() {
        // TODO Auto-generated constructor stub
        super();
    }

    PhoneAlreadyExists(String message) {
        super(message);
    }

}

【问题讨论】:

  • 在类中添加一个serialVersionUID 字段。
  • 它只是一个警告,它不会崩溃任何东西。如果它真的让您感到困扰,您可以通过将鼠标悬停在警告上并单击第一个建议(或任何说您可以禁止它的建议)来禁止它。
  • 看看我下面的回答。这可能会有所帮助。
  • 也复制了thisthisthisthis等等。

标签: java


【解决方案1】:

您需要声明一个 long 类型的静态最终 serialVersionUID 字段。

查找Java的Serializable API。异常必须实现Serializable,并且Serializable类必须有serialVersionUID

public static final long serialVersionUID = 1L;

每当您对类进行不兼容的更改时,请增加此版本。

【讨论】:

    【解决方案2】:

    在您的班级添加注释@SuppressWarnings("serial"),以忽略该警告

    【讨论】:

    • 或者只是正确解决警告。它通常比忽略它要好,即使它是 4 行代码(当然包括 JavaDoc - 否则它只是 1)
    • 当然可以,但是通常我们不需要定义串行版本,因此这是解决问题的快速方法。
    • 这并不是真的更快。 Java IDE 可以使用“快速修复”功能生成串行版本字段。例如。日食。
    • @Anony-Mousse 每一行代码都代表着意图。如果您不打算将对象序列化,并且添加代码以支持相反,那么您正在编写不连贯的代码。如果我们坚持所有可能的“3 行代码”更改,那么您的代码的有意部分最终将成为您实际代码的少数,如果您想编写您希望以后能够返回的代码,这是很危险的.编译器的、脆弱的基类和 typeclass 的责任是为你的类添加趣味,而不是你的特定类本身。
    • @Dmitry 如果您不希望该类可序列化,则不要实现Serializable 接口! 导致不一致的不是serialVersionUID 字段,也不会忽略问题来解决它。当类定义发生变化时,这个字段所做的只是帮助识别反序列化问题。添加它不会“启用”序列化,忽略警告不会阻止序列化。
    【解决方案3】:

    要全局更改 Eclipse 中的行为:转到 Preferences->Java->Compiler->Errors/Warnings->Potential Programming Problems。这个特定问题有一个条目。您也可以针对特定项目进行更改。

    这回答了您的问题,不过 - 我建议将其保留在警告级别并添加缺少的字段。或者为那些真正不需要该字段的可序列化类添加 SuppressWarnings 注解,因为它们永远不会被序列化。

    【讨论】:

    • 谢谢。实际上是首选项 -> Java -> 编译器 -> 错误/警告 -> 潜在的编程问题
    • 感谢指正!我已经用正确的路径更新了我的答案。
    • 有趣的是,最有用/最切题的答案总是被遗忘,你的答案应该是公认的。
    • 请注意,从某个可序列化类型派生匿名类型时会收到此警告 - 即使超类型 有自己的 @SuppressWarnings("serial")!!)。例如,当使用 Guava 的 TypeToken 时。 (Eclipse 4.4.2。)我想我可以注释新匿名类型的站点......但它是一个 PITA,我宁愿完全关闭这个几乎无用的警告。
    • @Anony-Mousse 一般来说我同意你的观点,但除非你序列化你的异常,通过 RMI/CORBA 发送它们或将它们存储到磁盘,大多数人不会在大多数域中遇到异常序列化问题.如果您所在的域会受到影响,您(应该)知道。因此,99% 的人不会在他们的网络应用程序中看到问题。这就是为什么应该可以为项目全局禁用它的原因。太糟糕了,没有像 .eslintrc 这样的针对 Java 的全局可用修复。
    【解决方案4】:

    只需在您的公共类 PhoneAlreadyExists 上方添加此代码 @SuppressWarnings("serial") extends Exception { line

    【讨论】:

    • 请提供更多详细信息并适当地格式化您的答案。
    【解决方案5】:

    在大多数情况下最好添加serialversionUID,但eclipse会在所有swing派生类上发出警告,这些类永远不会被序列化。我尝试在首选项-> Java -> 编译器-> 错误/警告-> 潜在的编程问题中更改设置,但没有效果。所以我想最好的解决方案是抑制每个永远不会被序列化的类的警告;或者咬紧牙关忽略警告。

    【讨论】:

      【解决方案6】:

      若要忽略警告“可序列化的类 ClASSNAME 未声明静态最终 serialVersionUID......”,请在 eclipse* 中执行以下操作:

      1. 点击 Window-Preferences-Java-Compiler-Errors/Warnings
      2. 点击“潜在的编程问题”
      3. 向下滚动到“Serializable class without serialVersionUID”
      4. 选择“忽略”
      5. 点击应用
      6. 点击确定

      保存并关闭您的 Eclipse IDE 当您重新打开 Eclipse 时,这些特定警告不应再列出。

      *对于这个示例解决方案,我正在使用面向 Java 开发人员的 Eclipse IDE - 版本:Mars.2 Release (4.5.2)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-05
        • 2014-01-24
        • 2010-12-03
        • 2013-08-29
        • 2011-01-18
        • 2013-01-26
        • 2012-12-25
        • 2016-11-08
        相关资源
        最近更新 更多