java - 序列化时类的方法必须相同吗?

标签 java serialization

我觉得问这个问题很愚蠢,但是为了通过 ObjectInput/Output Streams 通过套接字进行序列化工作,接收它的程序中的类必须完全相同,如果类不完全相同,则会产生错误相同,或者他们可以有一些不同的方法/等等?如果这个问题太简单而无法在这里问,我很抱歉。

最佳答案

默认情况下,java编译器将生成一个私有(private)静态长serialVersionUID,并且该ID必须在两端匹配。如果方法不同,生成的 id 将不匹配。

解决这个问题的简单方法是对 ID 进行硬编码。

private static final long serialVersionUID = -1;

并且它总是匹配。

下一步是字段也应该匹配。但是,如果您编写自己的 readObject() 方法,并且在某些类中执行此操作,则可以更改这些内容,因为字段剃须会随着时间的推移而变化。

Spec for how serialVersionUID is calculated

流中的项目顺序如下:

  1. 类名。
  2. 以 32 位整数形式编写的类修饰符。
  3. 每个接口(interface)的名称按名称排序。
  4. 对于按字段名称排序的类的每个字段(私有(private)静态和私有(private) transient 字段除外:
    A。字段的名称。
    b.字段的修饰符写为 32 位整数。
    C。字段的描述符。
  5. 如果存在类初始值设定项,请写出以下内容:
    A。方法的名称,.
    b.方法的修饰符,java.lang.reflect.Modifier.STATIC,写为32位整数。
    C。方法的描述符,()V。
  6. 对于按方法名称和签名排序的每个非私有(private)构造函数:
    A。方法的名称,
    b.方法的修饰符写为 32 位整数。
    C。方法的描述符。
  7. 对于按方法名称和签名排序的每个非私有(private)方法:
    A。方法的名称。
    b.方法的修饰符写为 32 位整数。
    C。方法的描述符。
  8. SHA-1 算法在 DataOutputStream 生成的字节流上执行,并生成五个 32 位值 sha[0..4]。
  9. 哈希值由 SHA-1 消息摘要的第一个和第二个 32 位值组合而成。如果消息摘要的结果(五个 32 位字 H0 H1 H2 H3 H4)位于名为 sha 的五个 int 值的数组中,则哈希值将按如下方式计算:

关于java - 序列化时类的方法必须相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25002595/

相关文章:

java - Q : Is embedding Java bad practice in BPEL?

java - 使用域驱动设计从服务和 Controller 类返回类型的约定?

java - 使用反射动态保存一个类中的所有字段? ("<FieldName>","<FieldValue>")

c# - Json.Net 未正确序列化版本类型

c# - EF 中的可序列化类和动态代理 - 怎么样?

c# - 尝试序列化异常时忽略自定义解析器

java - getStringArrayListExtra 给我一个空值,但我有值

java - 在我的 MainActivity 的 textView 中设置文本

java - 基于 GWT 的 Web 应用程序的类似 Outlook 的调度组件

c# - 使用 JsonFX 反序列化字典