SerialVersionId在序列化中的重要性?

这个问题在这里已经有了答案:

  • 什么是serialVersionUID,为什么我应该使用它? 21个答案

  • 它用于检查序列化和DeSerialization是否使用了相同的类定义。 直接从文档

    序列化运行时与每个可序列化类关联一个称为serialVersionUID的版本号,在反序列化过程中使用该版本号来验证序列化对象的发送者和接收者是否已加载该对象的与序列化相容的类。 如果接收者已经为与对应的发送者类具有不同serialVersionUID的对象加载了类,则反序列化将导致InvalidClassException。 一个可序列化的类可以通过声明一个名为“serialVersionUID”的字段来声明自己的serialVersionUID,该字段必须是static,final和long类型的:

    任意访问修改器static final long serialVersionUID = 42L;

    如果可序列化类没有显式声明serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认serialVersionUID值,如Java(TM)对象序列化规范中所述。 但是,强烈建议所有可序列化的类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息高度敏感,这可能因编译器实现而异,因此在反序列化期间可能会导致意外的InvalidClassException。 因此,要确保跨不同的java编译器实现保持一致的serialVersionUID值,可序列化的类必须声明显式的serialVersionUID值。 还强烈建议显式serialVersionUID声明尽可能使用private修饰符,因为这些声明仅适用于立即声明的类 - serialVersionUID字段作为继承成员是无用的。

    另外,请查阅Josh Bloch的着作Effective Java(第2版):

    自动生成的UID是基于类名称,实现的接口以及所有公共和受保护成员生成的。 以任何方式更改这些内容都将更改serialVersionUID。 因此,只有在确定不会有超过一个版本的类将被序列化(跨进程或稍后从存储中检索到)时,您才不需要混淆它们。

    如果您现在忽略它们,并且稍后发现需要以某种方式更改该类,但保持与该类的旧版本的兼容性,则可以使用JDK工具serialver在旧类上生成serialVersionUID,并明确设置那就是新班级。 (根据您的更改,您可能还需要通过添加writeObject和readObject方法来实现自定义序列化 - 请参阅Serializable javadoc或上述第11章。)


    来自Serializable Object的文档

    序列化运行时与每个可序列化类关联一个称为serialVersionUID的版本号,在反序列化过程中使用该版本号来验证序列化对象的发送者和接收者是否已加载该对象的与序列化相容的类。 如果接收者已经为与对应的发送者类具有不同serialVersionUID的对象加载了类,则反序列化将导致InvalidClassException。 一个可序列化的类可以通过声明一个名为“serialVersionUID”的字段来声明自己的serialVersionUID,该字段必须是static,final和long类型的:

    任意访问修改器static final long serialVersionUID = 42L;

    如果可序列化类没有显式声明serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认serialVersionUID值,如Java(TM)对象序列化规范中所述。 但是,强烈建议所有可序列化的类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息高度敏感,这可能因编译器实现而异,因此在反序列化期间可能会导致意外的InvalidClassException。 因此,要确保跨不同的java编译器实现保持一致的serialVersionUID值,可序列化的类必须声明显式的serialVersionUID值。 还强烈建议显式serialVersionUID声明尽可能使用private修饰符,因为这些声明仅适用于立即声明的类 - serialVersionUID字段作为继承成员是无用的。 数组类无法声明显式的serialVersionUID,因此它们始终具有默认的计算值,但是对于数组类而言,不需要匹配serialVersionUID值。

    有一个类似的线程。 在这里检查


    使用不同的VM或不同的机器序列化和反序列化同一个类时非常重要。 UID用于检查,如果你想要反序列化的类是你认为它的类,那么如果你的代码中的类有一个UID,并且序列化的类有不同的类,那么反序列化将失败。

    没有UID的类将由JVM自动提供,但不能保证不同的JVM将同一个UID赋予同一个类。

    你也可以参考我从SO发现的这个:

    什么是serialVersionUID,为什么我应该使用它? http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

    链接地址: http://www.djcxy.com/p/23845.html

    上一篇: Importance of serialVersionId in Serialization?

    下一篇: Serial version id mismatch issue between server and client class