我目前正在一个项目中,该项目需要保留任何类型的对象(我们没有任何控制权的实现),以便以后可以恢复这些对象。
我们无法实现ORM,因为我们不能在开发时限制我们库的用户。
我们的第一个选择是使用Java默认序列化对其进行序列化,但是当用户开始传递同一对象的不同版本(属性更改的类型,名称等)时,恢复对象存在很多麻烦。
我们尝试使用XMLEncoder类(将对象转换为XML),但是发现缺少功能(例如,不支持Enums)。
最后,我们还尝试了JAXB,但这迫使我们的用户注释其类。
有什么好的选择吗?
对您来说,最简单的方法仍然是使用序列化(IMO),但是要对类的序列化形式进行更多的思考(无论如何,您还是应该这样做)。例如:
序列化的形式是该类API的一部分,应仔细考虑其设计。
因为我所说的几乎所有内容都来自有效Java,所以我不会赘述。取而代之的是,请您参考它,特别是有关序列化的章节。它会警告您您遇到的所有问题,并提供相应的解决方案:
http://www.amazon.com/Effective-Java-2nd-Joshua- Bloch/dp/0321356683
话虽如此,如果您仍在考虑非序列化方法,请注意以下几点:
XML编组
正如许多人指出的那样,这是一个选择,但我认为您仍然会遇到向后兼容的相同问题。但是,通过XML编组,您有望立即捕获这些错误,因为某些框架可能会在初始化期间为您做一些检查。
往返YAML
我一直在想这个主意,但是我真的很喜欢YAML格式(至少是自定义的toString()格式)。但实际上,对您而言唯一的区别是您将编组为YAML而不是XML。唯一的好处是,YAML比XML更具可读性。相同的限制适用。