2015-04-23 90 views
1

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

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

我再试一次,发现hessian将未知类型转换为'Hashmap'而不会抛出异常。但对于'Class '实例,'Class'是一个众所周知的类型,所以它开始转换并抛出'ClassNotFoundException',因为'T'是未知的。 – Anderson

回答

1

这取决于工具本身。 serialVersionUID旨在供Java内置序列化程序(ObjectOutputStream)使用,该程序可以通过阅读Hessian源文件来得到最佳的结果,而不会被Hessian使用。

对于黑森州具体而言,我可以找到其中提到这种变化的最好来源是this email

至少在黑森州,最好考虑版本作为改变的一组 类型,可以被处理。

具体来说,Hessian可以管理以下种类的更改:1) 如果您添加或删除一个字段,那么不理解 字段的一方会忽略它。 2)一些字段类型的变化是可能的,如果 Hessian可以转换(例如int变长)3)在映射(bean)类型上有一些灵活性 ,这取决于Hessian有多少信息 (这是偏好具体类型的原因)

所以,如果发送者发送了一个非类型映射{“field1”,10}而目标 被称为MyValue {int field1; },那么Hessian可以映射 字段。

但它不能管理像:1)字段名称更改(将删除数据 )。 2)类名更改,其中目标为 未定义,如Object field1。如果您发送MyValue2作为新的 field1,当以前的版本是MyValue1时,Hessian不能让 自动转换。 (但是,与上面的#3一样,“MyValue2字段1” 将给予足够的信息来翻译。)3)类 分裂,例如,创建一个子类并将其中的某些字段推送到其中。
4)映射到列表或列表以映射更改。

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

+0

非常感谢!但答案没有提到为什么它不能跳过'Map'字段,因为它匹配情况1)? – Anderson

+0

地图中的项目不是Java中的字段。案例一特别谈论“类型”的实例。 Hessian中的“类型”是Java中的类。因此,案例1只适用于未知领域。 Java中的HashMap是Hessian术语中的“无类型映射”。 – Pace