Serializable是如何工作的?

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

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

假设我想编写一个像Serializable一样的接口,我应该如何“警告”实现我的接口的程序员声明一个变量?我试过查看Serializable.java的源代码,但我找不到会导致此行为的任何内容。这是否可能?

谢谢!
2个回答

5
我认为您寻找的行为最好使用注解和注解处理器来实现。编译器警告您未声明serialVersionUID的事实是由编译器级别的不同机制处理的(因此,程序员无法控制);它更像是序列化API强制执行的编码约定,而不是实现Serializable接口的结果。
实际上,在这里您可以查看Serializable的源代码,正如您所见,它没有任何特殊之处来强制编译器警告:
/* comments removed for brevity */
package java.io;
public interface Serializable {
}

4
不,我认为仅使用Java是不可能实现的(也许可以使用一些注解?但我不确定)。事实上,Serializable接口不是普通的Java接口,而是一个标记元素,虽然它被用作接口,但它是特殊的,因此编译器会以其自己的方式处理它(因为它的意义表达了默认情况下未透明实现的功能,比如接口)。

2
是的,Java编译器可能会采取一些特殊的措施来打印那个警告。我认为你无法在Java中自己编写类似的程序。 - Michael
“Serializable”在语言和编译器中有很多内置的魔法,这些魔法是您无法在普通库中复制的。 - Louis Wasserman
我认为@Jack提到了所有好的观点。Nathan,问题是你有多想要这个?这篇帖子描述了一种可能的解决方案,尽管看起来需要做很多工作。如果它奏效了,请告诉我们。 - user845279
Java编译器不会打印该警告,但一些集成开发环境会。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接