XStream或Simple

我需要决定使用哪一个。 我的情况非常简单。 我需要将一个简单的POJO / Bean转换为XML,然后再转换回来。 没什么特别的。

我正在寻找的一件事是它应该包括父属性。 如果它可以在超类型上工作,那将是最好的,它可以只是一个标记界面。

如果有人可以将这两者与缺点和专业人士进行比较,那么哪一个缺少哪一个。 我知道XStream也支持JSON,这是一个优点。 但是,如果我们将JSON放在一边, Simple看起来就更简单了。 在开发和社区方面,Simple的未来是什么? 我相信XStream很受欢迎,即使是“XStream”这个词,在SO上打了很multithreading。

谢谢。

为什么不使用JAXB呢?

  • 100%架构覆盖率
  • 庞大的用户群
  • 多个实现(如果您遇到一个错误)
  • 包含在Java SE 6中,与JDK 1.5兼容
  • JAX-WS的绑定层(Web服务)
  • JAX-RS(Rest)的绑定层
  • 兼容JSON(与Jettison等库一起使用时)

有用的资源:

  • 比较,JAXB和XStream
  • 比较,JAXB和简单

只是阅读文档(我正面临着同样的问题,但还没有尝试过任何一种方式;带上一粒盐):

XSTREAM

  1. 非常非常容易谷歌。 有关它的示例,论坛post和博客文章很容易找到。
  2. 开箱即用。 (当然,可能需要更多调整,但它会立即给你一些东西 。)
  3. 将变量转换为属性需要创建单独的转换器类,并使用XStream注册它。 (对于简单的值来说并不难,但这是一项额外的工作。)
  4. 除非你添加XMT(另一个库),否则根本不处理版本控制; 如果您的类生成的XML发生更改,则根本不会反序列化。 (一旦你添加XMT,你就可以改变你喜欢的类,并让XStream处理得很好,只要你创建一个增加的增量版本控制function。)
  5. 所有调整都要求您编写代码,以实现自己的(反)序列化函数,或调用XStream函数来改变所使用的(反)序列化技术。
  6. 琐碎的语法注释:您需要将反序列化器的输出强制转换为您的类。

简单

  1. 主页是唯一可靠的信息来源; 它列出了大约六篇外部文章,并且有一个邮件列表,但你无法在狂野的互联网上找到它。
  2. 需要在代码工作之前注释代码。
  3. 对于每个属性,使用属性而不是XML节点来制作更紧凑的XML文件很容易。
  4. 每当类正确时,通过非严格解析来处理版本控制,但版本不同。 (即,如果您添加了两个字段并从上一个版本中删除了一个字段,它将忽略已删除的字段而不会抛出exception,但不会设置添加的字段。)与XStream一样,它似乎没有将数据从一个版本迁移到另一个版本的方法,但与XStream不同,没有外部库可以介入并处理它。 据推测,处理这个的方法是使用一些外部函数(也许是你class级中的“版本”变量?),所以你做的

    填充myRestoredStuff = serializer.read(Stuff.class,file); myRestoredStuff.sanityCheck();

  5. 通常使用(de)序列化调整是通过添加/编辑注释来完成的,但是如果你需要做一些粗略的事情,那么支持编写你自己的(de)序列化函数来覆盖标准方法。

  6. 琐碎的语法注释:您需要将已还原对象的类传递给反序列化器(但您不需要转换结果)。

我建议你看一下Simple

我也建议简单 ,看看教程 ,然后自己决定。 邮件列表响应迅速,您将始终得到任何查询的快速答案。

到目前为止,我从未使用过Simple框架。

根据我对Xstream的经验。 它在XML上运行良好。 但是,对于JSON,当我尝试序列化包含Hashtable列表的bean时,结果并不像预期的那样精确。

Simple和Jaxb的一个“简单”(双关语)缺点是它们需要在将对象序列化为XML之前对其进行注释。 当您很快想要使用未注释的对象序列化其他人的代码时会发生什么? 如果你能看到有一天发生的事情,那么XStream更适合。 (有时它真的只是归结为这样的简单要求来推动你的决定)。

在阅读stackoverflow时快速查看简单; 作为Paul Marshalls有用post的修正案,我想我会提到Simple似乎支持通过注释进行版本控制 –

http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#version

Simple比XStream慢得多(在序列化对象中为xml)

http://pronicles.blogspot.com/2011/03/xstream-vs-simple.html

以为我在这里分享。 要让XStream忽略缺少的字段(当您删除了属性时):

XStream xstream = new XStream() { @Override protected MapperWrapper wrapMapper(MapperWrapper next) { return new MapperWrapper(next) { @Override public boolean shouldSerializeMember(Class definedIn, String fieldName) { if (definedIn == Object.class) { return false; } return super.shouldSerializeMember(definedIn, fieldName); } }; } }; 

这也可以扩展为处理版本和属性重命名。

感谢Peter Voss: https : //pvoss.wordpress.com/2009/01/08/xstream