繁体   English   中英

Java中2个不同JVM上类的对象的序列化

[英]Serialization of an Object of a class on 2 different JVMs in java

我有一堂课,说Counter。 我在一台机器上在JVM-1上序列化此类的对象,然后将序列化的对象作为网络流传输到另一台机器上,并在JVM-2中反序列化。 该对象会正确反序列化吗? 在这种情况下会抛出任何错误/异常吗? 假设我已经在两个JVM上编译了该类。 我假设类中不存在串行版本UID

只要两端都运行相同的代码/ jdk(尽管可以使用不同的jdk),则序列化/反序列化将不是问题。

如果您的类中有serialVersionUID,则序列化/反序列化将不是问题,但是如果您的代码中缺少serialVersionUID,则因为您正在使用两个JVM编译类(我知道,.class文件具有相同的内容,但使用不同的JVM编译)在这种情况下,serialVersionUID由java分配,这将是不一样的,因此序列化/反序列化将不起作用。 因此,添加

private static final long serialVersionUID = -6903933977591709194L;

如果您没有添加任何值,并且可以进行多次编译,请放心,序列化/反序列化将起作用。 :)

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

ANY-ACCESS-MODIFIER静态最终长serialVersionUID = 11L;

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

如果接收方已为该对象加载了一个与相应发送方类具有不同的serialVersionUID的类,则反序列化将导致InvalidClassException。 可序列化的类可以通过声明一个名称为“ serialVersionUID”的字段来显式声明其自己的serialVersionUID,该字段必须是静态的,最终的且类型为long

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM