【问题标题】:How does Serializable work?可序列化如何工作?
【发布时间】:2012-06-01 15:32:55
【问题描述】:

这个问题不是关于如何使用 Serializable,我已经知道了。但是,我想知道如何实现 Serializable 会引发以下警告:

The serializable class MyClass does not declare a static final serialVersionUID field of type long

假设我想编写一个像Serializable 这样的接口,我将如何“警告”实现我的接口的程序员声明一个变量?我试过查看Serializable.java 的源代码,但找不到任何会导致这种行为的东西。这甚至可能吗?

谢谢!

【问题讨论】:

    标签: java serializable


    【解决方案1】:

    我认为使用注释和注释处理器可以更好地实现您正在寻找的行为。编译器警告您不要声明 serialVersionUID 的事实是由编译器级别的不同机制处理的(因此,超出了程序员的范围);它更多的是由序列化 API 强制执行的编码约定,而不是实现 Serializable 接口的结果。

    事实上,here 你可以查看Serializable 的源代码,如你所见,强制编译器警告并没有什么特别之处:

    /* comments removed for brevity */
    package java.io;
    public interface Serializable {
    }
    

    【讨论】:

    • 谢谢!这就是我要找的:)
    【解决方案2】:

    不,我认为仅使用 Java 是不可能的(也许有一些注释?不确定)。

    事实上Serializable接口并不是一个普通的Java接口而是一个标记元素,它被用作一个接口但是它是一个特殊的东西,所以它以自己的方式处理由编译器(因为它的含义表达了一种功能,如接口,默认情况下不会在代码中透明地实现)。

    【讨论】:

    • 是的,Java 编译器可能会执行一些特殊操作来打印该警告。我不认为你可以用 Java 自己编写类似的程序。
    • Serializable 在语言和编译器中具有很多你无法在普通库中复制的内置魔法。
    • 我认为@Jack 达到了所有优点。内森,问题是你想要这个有多糟糕? This 的帖子描述了一个可能的解决方案,尽管它看起来工作量很大。请让我们知道它是否有效。
    • Java 编译器不会打印该警告。一些 IDE 可以。
    猜你喜欢
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多