有人能准确地解释为什么串行版本id在java中是静态的吗

有人能准确地解释为什么串行版本id在java中是静态的吗,java,serialization,static,Java,Serialization,Static,每当我们遇到序列化时,我们的思想就会跳进串行版本id。 根据序列化api,我们不能使对象成为静态的,如果我们想序列化它,那么为什么我们可以使“serialiversionid”成为静态的呢 签名如下 私有静态最终长serialVersionUID=1L 在谷歌搜索之后,我得到了以下信息 在反序列化过程中,需要从数据创建对象。如果 无法检查对象是否可反序列化,也没有 获取对象成员的方法 任何其他信息都可以通过一个关于反序列化的示例来获得,Java会查看流,看看接下来是哪种类型和SerialVers

每当我们遇到序列化时,我们的思想就会跳进串行版本id。 根据序列化api,我们不能使对象成为静态的,如果我们想序列化它,那么为什么我们可以使“serialiversionid”成为静态的呢

签名如下

私有静态最终长serialVersionUID=1L

在谷歌搜索之后,我得到了以下信息

在反序列化过程中,需要从数据创建对象。如果 无法检查对象是否可反序列化,也没有 获取对象成员的方法


任何其他信息都可以通过一个关于反序列化的示例来获得,Java会查看流,看看接下来是哪种类型和SerialVersionId。基于此,在类加载器中查找静态类定义,以创建一个对象,然后该对象将接收从流读取的数据

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

检查serialVersionUID是防止对象初始化不完整的安全措施,即当流不包含成员数据(使用早期代码版本编写)但当前签名(和对象协定)要求将附加成员设置为某个值时。您可以通过不更改serialVersionUID来允许此类不完整的(非反序列化的成员),但如果您想确保反序列化时没有遗漏任何成员,则需要转储/更改serialVersionUID


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

它是静态的,因为它是类的属性,而不是对象的属性。就这么简单


如果您想知道它是如何与对象一起序列化的,它不会:它是作为对象类元数据的一部分发送的,每个类的每个连接只发送一次。

谢谢。这是一个非常有用的解释。如果我接受你的采访,你在面试中是合格的:)更改
serialVersionUID
几乎没有任何意义。完成的只是完全中断序列化,而不是部分中断,如果您在不更改
serialVersionUID的情况下修改了足够多的字段,就会发生这种情况。尽管它的名字很不幸,但它不能被认为是一个需要增加的类版本号。谢谢你提供的信息