java - 谁能准确解释为什么串行版本 ID 在 Java 中是静态的

标签 java serialization static

每当我们遇到序列化时,我们的思绪就会跳入序列版本 ID。 根据序列化 api,如果我们想序列化它,我们不能将对象设置为静态,我们怎么能将“serialiversionid”设置为静态。

签名如下

private static final long serialVersionUID = 1L;

谷歌搜索后我得到了以下信息。

During deserialization, Object needs to be created from the data. If there's no way to check whether object is deserializable, there's no way to get the Object members.

任何其他信息都可以作为示例

最佳答案

在反序列化时,Java 会查看流以查看接下来是哪个类型和 serialVersionUID。基于此,在类加载器中查找static 类定义以创建一个对象,然后该对象将接收从流中读取的数据。

现在,为确保流中的属性与将要填充的对象的属性相匹配,Java 检查 serialVersionUID。这需要是静态的,因为类加载器中的类定义也是静态的。在 Java 的同一个类加载器中,您不能拥有具有不断变化的签名(成员)的变形类。

检查 serialVersionUID 是一种安全措施,可以防止不完整的对象初始化,即当流不包含成员数据(用较早的代码版本编写)但当前签名(和对象契约)要求附加成员时设置为某物。您可以通过不更改 serialVersionUID 来允许此类不完整(未反序列化的成员),但是如果您想确保没有成员被反序列化遗漏,您需要碰撞/更改serialVersionUID.

(也许是一个很好的招聘面试问题。但不确定我是否合格:-))

关于java - 谁能准确解释为什么串行版本 ID 在 Java 中是静态的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39257007/

相关文章:

java - java中为什么直接调用静态变量和方法?

java - 从 soap 响应中移除 <return> 元素 - JaxWs

java - 当 main(String[] args) 是一个方法时,为什么编译器会说 "main class could not be found or loaded"?

java - 序列化具有不可序列化父类的对象

PHP 反序列化因非编码字符而失败?

c++ - 从 WndProc 调用非静态成员

python - Flask:在模板中放置静态 javascript 文件的位置

javascript - Pusher:如何获取 Pusher 中的私有(private) channel 订阅数?

Java:简单的正则表达式问题,完整的单词

.net - XMLSerializers Dll 加载失败,出现 Assembly.Load(byte[] asm)