序列化工具(即hessian)如何反序列化具有相同版本的一类不同版本serialVersionUID
?在大多数情况下,它可以跳过那些未知(在类加载器中找不到)字段并保持兼容。但是上次,我尝试添加一个新字段Map<String, Object>
,将一些未知对象放入地图中,然后它抛出了一个ClassNotFoundException
.
- 为什么不能像其他人一样跳过地图?
- 它是与工具的实现或序列化机制相关的问题吗?
序列化工具(即hessian)如何反序列化具有相同版本的一类不同版本serialVersionUID
?在大多数情况下,它可以跳过那些未知(在类加载器中找不到)字段并保持兼容。但是上次,我尝试添加一个新字段Map<String, Object>
,将一些未知对象放入地图中,然后它抛出了一个ClassNotFoundException
.
这将取决于工具本身。 serialVersionUID
旨在供 Java 的内置序列化程序ObjectOutputStream
(
特别是对于 Hessian,我能找到的提到这些变化的最佳来源是这封电子邮件:
至少对于 Hessian 而言,最好将版本控制视为一组可以处理的更改类型。
具体来说,Hessian 可以管理以下几种更改: 1)如果您添加或删除一个字段,不理解该字段的一方将忽略它。2)如果 Hessian 可以转换(例如 int 到 long),则可以进行一些字段类型更改 3)map(bean) 类型具有一定的灵活性,具体取决于 Hessian 拥有多少信息(这是更喜欢具体类型的原因。)
因此,如果发送者发送一个无类型映射 {"field1", 10} 并且已知目标是 MyValue { int field1; },那么 Hessian 可以映射字段。
但它无法管理以下内容:1)字段名称更改(数据将被删除)。2) 类名在目标未定义的地方发生变化,如 Object field1。如果您发送一个 MyValue2 作为新的 field1,当以前的版本是 MyValue1 时,Hessian 无法进行自动转换。(但与上面的#3 一样,“MyValue2 field1”将为 Hessian 提供足够的信息来进行翻译。) 3) 类拆分,例如创建一个子类并将一些字段推入其中。
4)映射到列表或列表到映射更改。
基本上,我不认为 Hessian 打算在地图中支持未知类型。