java - 这是Java序列化的最佳选择?

  显示原文与译文双语对照的内容
75 2

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

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

第一种方法是用Java默认序列化序列化它,但是当用户开始传递同一对象的不同版本时,我们会遇到很多麻烦。

我们已经尝试了XMLEncoder类( 将对象转换为 XML ),但是我们发现它缺少功能( 不支持枚举例如) 。

finally,我们也尝试了 JAXB,但这强制用户注释他们的类。

任何好的选择?

时间: 原作者:

68 0

最简单的方法是使用序列化,但是将更多的思想放在类( 不过你还是应该这么做)的序列化形式中。 举个例子:

  • 显式定义 SerialUID 。
  • 在适当的地方定义自己的序列化表单。

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

我不会详细介绍很多细节,因为我所说的几乎所有内容都来自 Effective Java 。 我将代替你,特别是关于序列化的章节。 它警告你遇到的所有问题,并为问题提供适当的解决方案:

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

也就是说,如果你仍在考虑一个非序列化方法,这里有一些:

XML

如许多人指出的是一个选项,但我认为你仍然会遇到相同的问题。 但是,通过XML编组,你希望立即捕获这些信息,因为有些框架可以能会在初始化期间进行检查。

从 YAML 转换到/from

这是我一直在玩的一个想法,但是我真的喜欢,格式的( 。至少作为自定义 toString() 格式) 。 但是,真正的不同之处在于,你将要编组到uielement而不是 XML 。 唯一的好处是,YAML比XML更具有可读性。 同样的限制适用。

原作者:
90 2

它是 2011,在商业级的REST Web服务 项目中,我们使用以下序列化程序为客户提供各种媒体类型:

我们最近尝试了其他序列化程序:

Jackson JSON,Kryo和Jackson的微笑比好旧的Java对象序列化快得多,约 3x 到 4.5 x 。 XStream在缓慢的一边。 但是现在这些都是可靠的选择。 我们会监视其他三个。

原作者:
...