Java序列化的最佳替代方案是什么?

Java序列化的最佳替代方案是什么?,java,serialization,xml-serialization,Java,Serialization,Xml Serialization,我目前正在进行一个项目,该项目需要持久化任何类型的对象(我们对其实现没有任何控制权),以便以后可以恢复这些对象 我们不能实现ORM,因为我们不能在开发时限制我们库的用户 我们的第一个备选方案是使用Java默认序列化对其进行序列化,但是当用户开始传递同一对象的不同版本(属性更改类型、名称等)时,我们在恢复对象时遇到了很多麻烦 我们已经尝试使用XMLEncoder类(将对象转换为XML),但是我们发现缺少功能(例如不支持枚举) 最后,我们还尝试了JAXB,但这迫使我们的用户对他们的类进行注释 有好的

我目前正在进行一个项目,该项目需要持久化任何类型的对象(我们对其实现没有任何控制权),以便以后可以恢复这些对象

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

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

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

最后,我们还尝试了JAXB,但这迫使我们的用户对他们的类进行注释


有好的选择吗?

很好,请看一看!非常方便

例如,尝试序列化为json。

可能吗?

对于您来说,最简单的事情仍然是使用序列化,IMO,但要更多地考虑类的序列化形式(无论如何,您确实应该这样做)。例如:

  • 显式定义SerialUID
  • 在适当的地方定义自己的序列化表单
  • 序列化表单是类API的一部分,在设计时应仔细考虑

    我不想谈太多细节,因为我所说的几乎所有东西都来自有效的Java。相反,我会让您参考它,特别是关于序列化的章节。它会警告您遇到的所有问题,并为问题提供适当的解决方案:


    话虽如此,如果您仍在考虑采用非序列化方法,以下是几点:

    XML编组

    正如许多人指出的那样,这是一种选择,但我认为在向后兼容性方面仍然会遇到同样的问题。然而,有了XML编组,您很有希望马上就能看到这些,因为有些框架可能会在初始化期间为您做一些检查

    与YAML的转换

    这是我一直在玩弄的一个想法,但我真的很喜欢YAML格式(至少作为一种自定义toString()格式)。但实际上,对您来说唯一的区别是将编组到YAML而不是XML。唯一的好处是YAML比XML更容易让人阅读。同样的限制也适用

    我们没有任何控制权

    解决办法是不要这样做。如果不能控制类型的实现,就不应该序列化它。故事结束了。Java Serialization提供serialVersionUID,专门用于管理类型的不同版本之间的序列化不兼容性。如果不控制实现,则无法确保在开发人员更改类时正确更改ID

    举一个简单的“点”的例子。它可以用笛卡尔坐标系或极坐标系表示。对于您来说,构建一个能够动态处理此类更正的系统的成本太高了——设计序列化的必须是类的开发人员

    简而言之,错的是你的设计,而不是技术。

    就我个人而言,我使用了很多,因为它具有与Smalltalk(大众和Squeak)和Python的互操作性。(免责声明,我是Fame项目的主要贡献者。)

    是一个很好的序列化对象的库,但它不会是一种自动的东西。如果您必须序列化的对象数量相对固定,这可能是一个不错的选择,但是如果您的“客户”将一直向您抛出新类,那么这可能比它的价值更大(尽管对于所有特殊情况,肯定比XMLEncoder更容易)

    另一种方法是要求您的客户为他们扔给您的任何对象提供适当的.betwixt文件(这有效地减轻了他们的责任)

    长短不一——序列化很难——没有完全脑死的方法。Java序列化就像我所见过的一样,几乎是一个死脑筋的解决方案,但正如您所发现的,不正确地使用版本uid值可能会破坏它。Java序列化还需要使用标记“Serializable”接口,因此如果您无法控制源代码,那么您在这方面就有点运气不佳


    如果需求真的像您描述的那样艰巨,那么您可能不得不对对象/方面/任何东西求助于某种BCE(字节码修改)。这已经超出了一个小型开发项目的领域,进入了Hibernate、Casper或ORM的领域……

    谷歌提出了一个二进制协议——比XML更快,负载更小——其他人建议将其作为替代方案


    <> P>协议缓冲区的一个优点是它可以与C、C++、Python和java进行信息交换。p> 现在是2011年,在一个商业级REST web服务项目中,我们使用以下序列化程序为客户提供各种媒体类型:

    • (适用于XML,但不适用于JSON)
    • (对于JSON)
    • (一种快速、紧凑的二进制序列化格式)
    • (Jackson 1.6及更高版本附带的二进制格式)
    • Java对象序列化
    我们最近尝试了其他序列化程序:

    • 看起来很稳定,运行速度是XStream的2倍,但对于我们的情况,需要太多的配置
    • 有几个虫子
    • 有一个关于日期的小错误

    jacksonjson、Kryo和jacksonsmile都比优秀的旧Java对象序列化速度快3到4.5倍。XStream的速度较慢。但在这一点上,这些都是可靠的选择。我们将继续监视其他三个。这也是一个非常快速的JDK序列化替代品:

    如果是系列