我有一个课说反。我在一台机器和JVM-1上序列化了这个类的Object。将序列化对象作为网络流传输到另一台机器&在JVM-2中反序列化。 这个对象会被正确反序列化吗? 在这种情况下会抛出任何错误/异常吗? 假设我已经在两个JVM上编译了类。 我假设类
中没有串行版本UID答案 0 :(得分:2)
只要你在两端运行相同的代码/ jdk(虽然可能有不同的jdks可以工作),序列化 - 反序列化就不会有问题。
答案 1 :(得分:2)
如果你的类中有serialVersionUID,序列化/反序列化不会有问题,但是如果你的代码中缺少serialVersionUID,因为你正在用两个JVM编译类(我明白,.class文件具有相同的内容但是编译为在这种情况下,serialVersionUID由java分配,它们将不相同,因此序列化/反序列化将不起作用。 所以,添加
private static final long serialVersionUID = -6903933977591709194L;
如果您没有添加任何值,并且编译了多次,请放心,序列化/反序列化将起作用。 :)
答案 2 :(得分:0)
序列化运行时将每个可序列化类与版本号相关联,称为serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否已加载与该序列化兼容的该对象的类。如果接收者为具有与相应发送者类的serialVersionUID不同的对象加载了一个类,则反序列化将导致InvalidClassException。可序列化类可以通过声明名为“serialVersionUID”的字段来明确声明其自己的serialVersionUID,该字段必须是static,final和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,该字段必须是static,final和long类型