我觉得问这个问题很愚蠢,但是为了通过 ObjectInput/Output Streams 通过套接字进行序列化工作,接收它的程序中的类必须完全相同,如果类不完全相同,则会产生错误相同,或者他们可以有一些不同的方法/等等?如果这个问题太简单而无法在这里问,我很抱歉。
最佳答案
默认情况下,java编译器将生成一个私有(private)静态长serialVersionUID
,并且该ID必须在两端匹配。如果方法不同,生成的 id 将不匹配。
解决这个问题的简单方法是对 ID 进行硬编码。
private static final long serialVersionUID = -1;
并且它总是匹配。
下一步是字段也应该匹配。但是,如果您编写自己的 readObject()
方法,并且在某些类中执行此操作,则可以更改这些内容,因为字段剃须会随着时间的推移而变化。
Spec for how serialVersionUID is calculated
流中的项目顺序如下:
- 类名。
- 以 32 位整数形式编写的类修饰符。
- 每个接口(interface)的名称按名称排序。
- 对于按字段名称排序的类的每个字段(私有(private)静态和私有(private) transient 字段除外:
A。字段的名称。
b.字段的修饰符写为 32 位整数。
C。字段的描述符。 - 如果存在类初始值设定项,请写出以下内容:
A。方法的名称,.
b.方法的修饰符,java.lang.reflect.Modifier.STATIC,写为32位整数。
C。方法的描述符,()V。 - 对于按方法名称和签名排序的每个非私有(private)构造函数:
A。方法的名称,。
b.方法的修饰符写为 32 位整数。
C。方法的描述符。 - 对于按方法名称和签名排序的每个非私有(private)方法:
A。方法的名称。
b.方法的修饰符写为 32 位整数。
C。方法的描述符。 - SHA-1 算法在 DataOutputStream 生成的字节流上执行,并生成五个 32 位值 sha[0..4]。
- 哈希值由 SHA-1 消息摘要的第一个和第二个 32 位值组合而成。如果消息摘要的结果(五个 32 位字 H0 H1 H2 H3 H4)位于名为 sha 的五个 int 值的数组中,则哈希值将按如下方式计算:
关于java - 序列化时类的方法必须相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25002595/