我有一个简单的Java类,我需要序列化以存储为RDBMS或键值存储中的值。该类只是简单类型属性的集合(本机类型或本地类型的映射/列表)。问题是该类可能会随着时间的推移而发展(可能:添加新属性,不太可能但仍然可能:重命名属性,更改属性类型,删除属性)。
我希望能够优雅地处理类版本中的更改。具体来说,当尝试从旧版本反序列化实例时,我希望能够指定某种处理程序来管理旧实例到最新版本的转换。
我不认为Java的内置序列化在这里是合适的。在我尝试推出自己的解决方案之前,我想知道是否有人知道任何可能有用的现有库?我知道Java有很多替代序列化方法,但是我特意寻找的东西可以让我优雅地处理类定义随时间的变化。
修改
为了它的价值,我最终选择了协议缓冲区(http://code.google.com/p/protobuf/)序列化,因为它可以灵活地添加和重命名字段,同时我需要维护的代码更少(参考自定义)使用readObject / writeObject进行Java序列化。
答案 0 :(得分:4)
Java序列化允许通过提供readObject
和writeObject
方法来自定义序列表单。与ObjectInputStream.readFields
,ObjectOutputStrean.putFields
和定义serialPersistentFields
一起,序列化表单可能与实现类中的实际字段无关。
但是,Java序列化产生的不透明数据不适合通过其他技术进行读写。
答案 1 :(得分:2)
也许您应该将Java类映射到关系模型中。将一些语言序列化的blob转储到数据库列中是一种可怕的方法。
答案 2 :(得分:1)
使用读写对象非常简单。
尝试将serialversionuid设置为固定值,然后为您的版本定义静态最终字段。然后,readobject可以使用switch语句根据版本构造字段。我们使用它来存储我们文件系统的历史数据。它的检索速度非常快 - 以至于用户无法区分它们。
答案 3 :(得分:0)
我有类似的问题。我发现当你有多个版本的对象时,Java的serialVersionUID并没有多大帮助。所以我推出了自己的。
以下是我保存用户会话的方法,
可能有更简单的方法,但我们的方法为我们提供了最大的灵活性。
答案 4 :(得分:0)
从未尝试过,但您可以使用自定义引导加载程序执行某些操作,以便在运行时为正在反序列化的对象加载类文件的正确版本。