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