繁体   English   中英

类的方法必须相同才能进行序列化吗?

[英]Do a class's methods have to be the same for serialization?

我觉得这很愚蠢,但是要使通过ObjectInput / Output Streams在套接字上进行序列化工作,接收程序中的类是否必须完全相同,如果这些类不完全相同,则会产生错误,或者他们可以有几种不同的方法/等吗? 如果这太简单了,请在这里提出一个问题,对不起。

默认情况下,java编译器将生成一个private static long serialVersionUID并且此ID的两端必须匹配。 如果方法不同,则生成的ID将不匹配。

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

private static final long serialVersionUID = -1;

并且将始终匹配。

下一步是字段也应该匹配。 但是,如果您编写自己的readObject()方法,则可以更改这些readObject()并且在某些类中可以这样做,因为随着时间的流逝,字段剃须发生了变化。

有关如何计算serialVersionUID的规范

流中的项目顺序如下:

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

如果使用默认(反)序列化,则可以进行多个兼容的更改而不会破坏它,请参见“可序列化对象的版本控制” ,在“ 5.6.1不兼容的更改”中,以下内容作为不兼容的更改列出。 具体来说,添加方法不会破坏序列化。

也就是说,已知默认序列化在非常有限的用例中是适当的,并且最好使用其他方法,例如JSON

  • 删除字段-如果在类中删除了字段,则写入的流将不包含其值。 当较早的类读取流时,该字段的值将设置为默认值,因为流中没有可用的值。 但是,此默认值可能会不利地损害早期版本履行其合同的能力。
  • 将类上移或下移-这是不允许的,因为流中的数据以错误的顺序显示。
  • 将非静态字段更改为静态或将非瞬态字段更改为瞬态-当依赖默认序列化时,此更改等效于从类中删除字段。 该版本的类不会将该数据写入流,因此该类的早期版本将无法读取该数据。 与删除字段时一样,早期版本的字段将被初始化为默认值,这可能导致类以意外方式失败。
  • 更改原始字段的声明类型-类的每个版本都使用其声明类型写入数据。 尝试读取该字段的早期版本的类将失败,因为流中的数据类型与该字段的类型不匹配。
  • 更改writeObject或readObject方法,使其不再写入或读取默认字段数据,或者对其进行更改,以使其尝试写入或读取默认字段数据,而先前版本则不这样做。 默认字段数据必须一致地出现在流中或不出现在流中。
  • 将类从Serializable更改为Externalizable或将其更改为Externalizable都是不兼容的更改,因为流将包含与可用类的实现不兼容的数据。
  • 将类从非枚举类型更改为枚举类型,反之亦然,因为流将包含与可用类的实现不兼容的数据。
  • 删除Serializable或Externalizable是一项不兼容的更改,因为在编写时它将不再提供该类的旧版本所需的字段。
  • 如果该行为会产生与该类的任何旧版本不兼容的对象,则将writeReplace或readResolve方法添加到类是不兼容的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM