我有一个叫计数器的班级。我在一台机器上的JVM-1上序列化该类的对象,并将序列化后的对象作为网络流传输到另一台机器上,然后在JVM-2中反序列化。这个对象会被正确地反序列化吗?在这种情况下会抛出任何错误/异常吗?假设我已经在两个JVM上编译了类。我假设类中没有序列版本的UID
发布于 2013-10-17 16:03:07
只要在两端运行相同的代码/jdk(尽管不同的jdk可以工作),序列化-反序列化就不是问题。
发布于 2013-10-17 16:21:42
如果您类中有serialVersionUID,序列化/反序列化将不是问题,但是如果您的代码中缺少serialVersionUID,因为您正在用两个JVM编译类(我理解,.class文件具有相同的内容,但是使用不同的JVM进行编译),在这种情况下,serialVersionUID是由java分配的,这将不会是相同的,因此序列化/反序列化将不起作用。所以,添加
private static final long serialVersionUID = -6903933977591709194L;如果您没有添加任何值,并多次编译,请放心,序列化/反序列化将会起作用。:)
发布于 2013-10-17 16:14:32
序列化运行时将称为serialVersionUID的版本号与每个可序列化类相关联,该版本号在反序列化期间用于验证序列化对象的发送方和接收方是否已为该对象加载了与序列化兼容的类。如果接收方为对象加载的类具有与相应发送方的类不同的serialVersionUID,则反序列化将导致InvalidClassException。可序列化的类可以通过声明一个名为" serialVersionUID“的字段来显式声明它自己的serialVersionUID,该字段必须是静态的、最终的和类型为long的:
ANY-ACCESS-MODIFIER静态最终长serialVersionUID = 11L;
如果可序列化类没有显式声明serialVersionUID,则序列化运行时将根据类的各个方面计算该类的默认Java值,如Java对象序列化规范中所述。但是,强烈建议所有可序列化的类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类细节高度敏感,这些细节可能因编译器实现而异,因此在反序列化过程中可能会导致意外的InvalidClassExceptions。因此,为了在不同的java编译器实现中保证一致的serialVersionUID值,可序列化的类必须声明显式的serialVersionUID值。还强烈建议显式serialVersionUID声明尽可能使用private修饰符,因为此类声明仅适用于直接声明的类--serialVersionUID字段作为继承的成员并不有用。数组类不能声明显式的serialVersionUID,因此它们始终具有默认的计算值,但是对于数组类,不需要匹配serialVersionUID值。
如果接收方为对象加载的类具有与相应发送方的类不同的serialVersionUID,则反序列化将导致InvalidClassException。可序列化的类可以通过声明名为" serialVersionUID“的字段来显式声明其自己的最终字段,该字段必须是静态的、最终的且类型为long
https://stackoverflow.com/questions/19421176
复制相似问题