InvalidClassException:本地类不兼容:流classdesc serialVersionUID = -196410440475012755,本地类serialVersionUID = -6675950253085108747

在以下情况下,我将使用InvalidClassException进行构造。在这里,我的EAR已安装在4个Websphere App服务器中,并且在其中共享执行。有时我从POJO类中获取了InvalidClassException异常,该异常实现了Serializable接口(interface)。请对此提供任何线索。我对此没有任何线索。

最佳答案

当您实现java.io.Serializable接口(interface)以使一个类可序列化时,编译器将查找一个名为long的静态最终字段“serialVersionUID”。如果该类没有显式声明此字段,则编译器将创建一个此类字段,并为其分配一个值,该值来自与实现有关的serialVersionUID计算。这种计算取决于类的各个方面,并且遵循Sun给出的对象序列化规范。但是,该值不能保证在所有编译器实现中都相同。

该值用于检查类在序列化方面的兼容性,并且在对保存的对象进行反序列化时可以完成此操作。序列化运行时验证发送者类(用于将对象的状态保存在流上)的serialVersionUID和接收者类(用于还原对象的类,可能在其他系统上使用)的serialVersionUID。两者完全相同。如果接收方系统已加载了具有除序列化过程中使用的类之外​​的其他serialVersionUID的类,则我们将收到InvalidClassException。

笔记 -
强烈建议您在要使其可序列化的所有类中显式声明并初始化long类型的静态最终字段,并将其命名为'serialVersionUID',而不是依赖于此字段的默认值计算。这种计算非常敏感,并且可能因编译器的不同而异,因此,即使对于同一类,您也可能会获得InvalidClassException,这仅仅是因为您在序列化过程的发送方和接收方使用了不同的编译器实现。

在大多数情况下,您只会在此字段上使用“私有(private)”访问说明符,因为声明通常仅适用于声明它的类,我们实际上并不需要继承子类中的该字段或从外部访问它。因此,几乎没有任何理由使我们不应该将其保持为“私有(private)”状态。

关于java.io.InvalidClassException :,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7173352/

10-11 02:56