序列化工具如何在反序列化期间跳过未知字段?

时间:2015-04-23 04:27:38

标签: java serialization deserialization hessian

序列化工具(即hessian)如何使用相同的serialVersionUID反序列化一个不同版本的类?在大多数情况下,它可以跳过那些未知(在类加载器中找不到)字段并保持兼容。但是上次,我尝试添加Map<String, Object>的新字段,将一些未知对象放入地图,然后抛出ClassNotFoundException

  • 为什么不能像其他人一样跳过地图?
  • 这是与工具的实现或序列化机制相关的问题吗?

1 个答案:

答案 0 :(得分:1)

这取决于工具本身。 serialVersionUID旨在供Java的内置序列化程序(ObjectOutputStream)使用,我可以通过阅读Hessian来源告诉它,Hessian不会使用它。

对于Hessian而言,我能找到的提到这些变化的最佳来源是this email

  

至少对于Hessian来说,最好将版本控制视为一组   可以处理的更改类型。

     

具体而言,Hessian可以管理以下类型的更改:1)   如果你添加或删除一个字段,那边不明白   字段会忽略它。 2)如果有一些字段类型的改变是可能的   Hessian可以转换(例如int到long)3)有一些灵活性   在地图(bean)类型上,取决于Hessian有多少信息   (这是偏好具体类型的原因。)

     

因此,如果发件人发送无类型地图{“field1”,10}和目标   已知是MyValue {int field1;然后Hessian可以映射   字段。

     

但它无法管理如下事项:1)字段名称更改(数据   将被删除)。 2)类名改变目标所在的位置   欠定义,如Object field1。如果您发送MyValue2作为新的   field1,当前一个版本是MyValue1时,Hessian无法制作   自动转换。 (但与上面的#3一样,“MyValue2 field1”   会给Hessian足够的信息来翻译。)3)上课   分裂,例如创建一个子类并将一些字段推入其中   4)映射到列表或列表以映射更改。

基本上,我认为Hessian不打算在地图中支持未知类型。