0

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

4

3 回答 3

2

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

private static final long serialVersionUID = -6903933977591709194L;

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

于 2013-10-17T08:21:41.907 回答
2

只要您在两端运行相同的代码/jdk(尽管不同的 jdk 可能工作),序列化-反序列化就不会成为问题。

于 2013-10-17T08:03:07.177 回答
0

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

ANY-ACCESS-MODIFIER static final long serialVersionUID = 11L;

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

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

于 2013-10-17T08:14:32.470 回答