【问题标题】:Why does serialization require a serial version UID in implemented class?为什么序列化在实现的类中需要序列版本 UID?
【发布时间】:2011-07-31 08:50:48
【问题描述】:

为什么序列化在实现的类中需要序列版本 UID?

【问题讨论】:

    标签: java serialization


    【解决方案1】:

    您是在问为什么要使用 UID?

    所以它知道两个序列化对象是否相互兼容。您可能已经更改了接口/方法/等。

    UID 是(诚然相当蹩脚的)合同,它说这两个对象实际上是同一类型的对象。

    【讨论】:

    • 你问为什么需要序列版 UID?
    【解决方案2】:

    来自the doc for java.ioSerializable

    序列化运行时将一个版本号与每个可序列化类相关联,称为 serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否已为该对象加载了与序列化兼容的类。如果接收者为对象加载了一个类,该对象的serialVersionUID 与相应发送者的类不同,则反序列化将导致InvalidClassException。可序列化类可以通过声明一个名为 "serialVersionUID" 的字段来显式声明自己的 serialVersionUID,该字段必须是静态的、最终的和 long 类型的

    【讨论】:

      【解决方案3】:

      serialVersionUID 在 Serializable 类中用作版本控制。如果您没有显式声明 serialVersionUID,JVM 将根据您的 Serializable 类的各个方面自动为您完成,如 Java(TM) Object Serialization Specification 中所述。

      【讨论】:

        【解决方案4】:

        为什么序列化需要一个 已实现的序列版 UID 上课?

        它根本不需要它。这是一项可选功能。

        【讨论】:

        • 可选意味着它将在运行时在序列化时自动生成......它很简单,要么你明确给出它,要么编译器将生成序列版本 UID。
        • @Anandj.Kadhi 不会。JVM 将生成它,特别是 ObjectOutputStream 和朋友。它仍然是可选的,并且它仍然不是由编译器生成的。不要在这里发布错误信息。
        • 在规范中提到However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassExceptions during deserialization 意味着不同的编译器实现会导致不同的 serailVersionUID,因此我提到了“编译器”。请刷新您的信息
        猜你喜欢
        • 1970-01-01
        • 2015-12-05
        • 2012-07-20
        • 1970-01-01
        • 2011-12-02
        • 2011-02-28
        • 1970-01-01
        • 1970-01-01
        • 2018-07-29
        相关资源
        最近更新 更多