XStream或Simple

时间:2009-10-13 03:39:14

标签: java xml jaxb xstream pojo

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

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

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

感谢。

9 个答案:

答案 0 :(得分:11)

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

<强> XSTREAM

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

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

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

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

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

答案 1 :(得分:8)

为什么不使用JAXB?

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

有用的资源:

答案 2 :(得分:7)

我建议您查看Simple

答案 3 :(得分:2)

我还建议Simple,看看tutorial,然后自己决定。邮件列表非常敏感,您将始终能够快速回答任何疑问。

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

我想在此分享一下。 要让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