7

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

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

如果有人可以将这两者与利弊进行比较,那么哪个缺少哪个东西。我知道XStream也支持 JSON,这是一个优点。但是,如果我们将 JSON 放在一边, Simple看起来更简单。Simple 在开发和社区方面的未来是什么?我相信 XStream 非常流行,甚至“XStream”这个词在 SO 上也引起了很多关注。

谢谢。

4

9 回答 9

11

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

XSTREAM

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

简单的

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

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

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

  6. 简单的语法说明:您需要将恢复的对象的类传递给反序列化器(但您不需要转换结果)。
于 2010-04-28T06:45:33.887 回答
8

为什么不改用 JAXB?

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

有用的资源:

于 2010-07-09T19:02:18.420 回答
7

我建议你看看Simple

于 2009-10-13T03:52:27.117 回答
2

我还建议Simple,看看教程,然后自己决定。邮件列表非常敏感,您总是会得到任何查询的及时答复。

于 2009-10-14T09:55:20.100 回答
1

到目前为止,我还没有使用过 Simple 框架。

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

于 2009-11-24T10:29:22.150 回答
1

以为我在这里分享这个。要让 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);
      }
    };
  }
};   

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

感谢彼得沃斯:https ://pvoss.wordpress.com/2009/01/08/xstream

于 2012-07-12T06:46:33.627 回答
1

Simple 和 Jaxb 的一个“简单”(双关语)缺点是它们需要先对对象进行注释,然后才能将它们序列化为 XML。当你想用没有注释的对象快速序列化别人的代码时会发生什么?如果有一天你能看到这种情况发生,那么 XStream 是更合适的选择。(有时它真的只是归结为像这样的简单要求来推动你的决定)。

于 2012-12-27T21:44:43.133 回答
0

在阅读stackoverflow时快速浏览了一下simple;作为对 Paul Marshalls 有用帖子的修订,我想我会提到 Simple 似乎确实支持通过注释进行版本控制-

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

于 2010-07-07T10:31:35.367 回答
0

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

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

于 2011-03-17T07:17:04.277 回答