java.io.InvalidClassException :

标签 java serialization

InvalidClassException: local class incompatible: stream classdesc serialVersionUID = -196410440475012755, local class serialVersionUID = -6675950253085108747

我在以下场景中使用 InvalidClassException 进行构造。在这里,我的 EAR 安装在 4 个 Websphere 应用程序服务器中,并在其中共享执行。有时我从 POJO 类中得到异常 InvalidClassException,它实现了 Serializable 接口(interface)。请提供任何线索。我对此一无所知。

最佳答案

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

此值用于检查类在序列化方面的兼容性,这是在反序列化保存的对象时完成的。 Serialization Runtime 验证发送者类的 serialVersionUID(用于保存流中对象的状态)和接收者类的(用于恢复对象的类,可能在其他系统中)两者完全相同。如果接收器系统加载的类具有与序列化过程中使用的类不同的 serialVersionUID,那么我们将得到一个 InvalidClassException。

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

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

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

相关文章:

java - HtmlUnit - 选择表单、复选框、文本字段和提交按钮

javascript - c# 和 javascript 之间的夏令时问题

java - 如何使用 GSON 序列化 UTF-8 中的日文字符?

java - AppEngine 数据存储管理 : cannot backup to cloudstore

java - 有两个按钮的表单,只有一个起作用

java - 在字符串中查找姐妹括号

android - Parcelable遇到IOException写入可序列化对象: java. io.NotSerializableException : org. json.JSONArray

java - CommonsMultipartFile 的 Jackson 序列化问题

java - GWT RemoteServiceServlet - 为什么要序列化以及如何处理 serialVersionUID?

java - 重铸 'this'解决方法