Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 序列化是如何工作的?_Java_Serializable - Fatal编程技术网

Java 序列化是如何工作的?

Java 序列化是如何工作的?,java,serializable,Java,Serializable,这个问题不是关于如何使用可序列化的,我已经知道了。但是,我想知道实现Serializable会如何带来以下警告: 可序列化类MyClass未声明long类型的静态最终SerialVersionId字段 假设我想编写一个像Serializable这样的接口,我该如何“警告”实现我的接口的程序员声明一个变量?我曾尝试查看Serializable.java的源代码,但找不到任何可能导致这种行为的东西。这可能吗? 谢谢 我认为使用注释和注释处理器可以更好地实现您正在寻找的行为。编译器警告您不要声明

这个问题不是关于如何使用可序列化的,我已经知道了。但是,我想知道实现
Serializable
会如何带来以下警告:

可序列化类MyClass未声明long类型的静态最终SerialVersionId字段


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


谢谢

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

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

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

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


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

是的,Java编译器可能会执行一些特殊操作来打印该警告。我不认为你自己可以用Java编写这样的程序。
Serializable
在语言和编译器中有很多内置的魔力,你无法在你的普通库中复制。我认为@Jack有很多优点。内森,问题是你有多想要这个?这篇文章描述了一个可能的解决方案,尽管它看起来需要做大量的工作。请让我们知道它是否有效。Java编译器不会打印该警告。有些人喜欢。谢谢!这就是我想要的:)