一尘不染

哪种是Java序列化的最佳选择?

java

我目前正在一个项目中,该项目需要保留任何类型的对象(我们没有任何控制权的实现),以便以后可以恢复这些对象。

我们无法实现ORM,因为我们不能在开发时限制我们库的用户。

我们的第一个选择是使用Java默认序列化对其进行序列化,但是当用户开始传递同一对象的不同版本(属性更改的类型,名称等)时,恢复对象存在很多麻烦。

我们尝试使用XMLEncoder类(将对象转换为XML),但是发现缺少功能(例如,不支持Enums)。

最后,我们还尝试了JAXB,但这迫使我们的用户注释其类。

有什么好的选择吗?


阅读 274

收藏
2020-09-08

共1个答案

一尘不染

对您来说,最简单的方法仍然是使用序列化(IMO),但是要对类的序列化形式进行更多的思考(无论如何,您还是应该这样做)。例如:

  1. 明确定义SerialUID。
  2. 在适当的地方定义自己的序列化表格。

序列化的形式是该类API的一部分,应仔细考虑其设计。

因为我所说的几乎所有内容都来自有效Java,所以我不会赘述。取而代之的是,请您参考它,特别是有关序列化的章节。它会警告您您遇到的所有问题,并提供相应的解决方案:

http://www.amazon.com/Effective-Java-2nd-Joshua-
Bloch/dp/0321356683


话虽如此,如果您仍在考虑非序列化方法,请注意以下几点:

XML编组

正如许多人指出的那样,这是一个选择,但我认为您仍然会遇到向后兼容的相同问题。但是,通过XML编组,您有望立即捕获这些错误,因为某些框架可能会在初始化期间为您做一些检查。

往返YAML

我一直在想这个主意,但是我真的很喜欢YAML格式(至少是自定义的toString()格式)。但实际上,对您而言唯一的区别是您将编组为YAML而不是XML。唯一的好处是,YAML比XML更具可读性。相同的限制适用。

2020-09-08