XStream 或简单
Posted
技术标签:
【中文标题】XStream 或简单【英文标题】:XStream or Simple 【发布时间】:2010-12-06 04:44:12 【问题描述】:我需要决定使用哪一个。我的情况很简单。我需要将一个简单的 POJO/Bean 转换为 XML,然后再返回。没什么特别的。
我正在寻找的一件事是它也应该包括父属性。最好是它可以在超级类型上工作,它可以只是一个标记界面。
如果有人可以将这两者与优缺点进行比较,那么哪一个中缺少哪一个。我知道XStream 也支持 JSON,这是一个优点。但是如果我们把 JSON 放在一边,Simple 一眼看上去就更简单了。 Simple 在开发和社区方面的未来是什么?我相信 XStream 非常流行,甚至“XStream”这个词在 SO 上也引起了很多关注。
谢谢。
【问题讨论】:
【参考方案1】:Simple 和 Jaxb 的一个“简单”(双关语)缺点是它们需要先对对象进行注释,然后才能将它们序列化为 XML。当你想用没有注释的对象快速序列化别人的代码时会发生什么?如果有一天你能看到这种情况发生,那么 XStream 是更合适的选择。 (有时它真的只是归结为像这样的简单要求来推动你的决定)。
【讨论】:
【参考方案2】:为什么不使用 JAXB?
100% 架构覆盖率 庞大的用户群 多种实现(以防您在一个中遇到错误) 包含在 Java SE 6 中,与 JDK 1.5 兼容 JAX-WS(Web 服务)的绑定层 JAX-RS (Rest) 的绑定层 与 JSON 兼容(与 Jettison 等库一起使用时)有用的资源:
Comparison, JAXB & XStream Comparison, JAXB & Simple【讨论】:
【参考方案3】:我想我在这里分享这个。 要让 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
【讨论】:
我不确定这是否是新的,但 xtream.ignoreUnknownElements() 至少在今天是一个选项。【参考方案4】:Simple 比 XStream 慢得多(在序列化对象到 xml 中)
http://pronicles.blogspot.com/2011/03/xstream-vs-simple.html
【讨论】:
Simple 比 XStream 快 4 倍左右,上面链接中的测试就像一个 5 岁的孩子会写的东西。我认为写这篇文章的人不了解如何使用框架,或者如何编写可靠的基准测试。 如果你想做点好事 - 自己动手 =) 自己写 只是让您知道评论的是简单自己的作者。我怀疑他会知道他自己的库与 XStream 相比有多快。【参考方案5】:在阅读***时快速浏览了一下simple;作为对 Paul Marshalls 有用帖子的修正,我想我会提到 Simple 似乎确实支持通过注释进行版本控制 -
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#version
【讨论】:
【参考方案6】:刚刚阅读了文档(我也遇到了同样的问题,但还没有尝试过任何一种方法;对此持保留态度):
XSTREAM
-
谷歌非常非常容易。关于它的示例、论坛帖子和博客帖子很容易找到。
开箱即用。 (当然,可能需要更多调整,但它会立即为您提供一些东西。)
将变量转换为属性需要创建一个单独的转换器类,并将其注册到 XStream。 (对于简单的值来说并不难,但需要做一些额外的工作。)
根本不处理版本控制,除非您添加 XMT(另一个库);如果您的类生成的 XML 发生变化,它根本不会反序列化。 (添加 XMT 后,您可以随意更改类,并让 XStream 处理它,只要您创建越来越多的增量版本控制函数。)
所有调整都需要您编写代码,以实现您自己的(反)序列化函数,或调用 XStream 函数来更改所使用的(反)序列化技术。
简单的语法说明:您需要将反序列化器的输出转换为您的类。
简单
-
主页是唯一可靠的信息来源;它列出了大约六篇外部文章,还有一个邮件列表,但你在狂野的互联网上找不到。
需要在代码运行之前对其进行注释。
使用属性而不是每个属性的 XML 节点可以轻松创建更紧凑的 XML 文件。
只要类正确但版本不同,就可以通过不严格的解析来处理版本控制。 (即,如果您添加了两个字段并从上一个版本中删除了一个,它将忽略已删除的字段并且不会抛出异常,但不会设置添加的字段。)与 XStream 一样,它似乎没有将数据从一个版本迁移到下一个版本的方法,但与 XStream 不同的是,没有外部库可以介入并处理它。据推测,处理这个问题的方法是使用一些外部函数(也许是你类中的“版本”变量?),所以你这样做
Stuff myRestoredStuff = serializer.read(Stuff.class, file); myRestoredStuff.sanityCheck();
常用的(反)序列化调整是通过添加/编辑注释来进行的,但如果您需要做一些笨拙的事情,则支持编写自己的(反)序列化函数来覆盖标准方法。
简单的语法说明:您需要将恢复的对象的类传递给反序列化器(但您不需要转换结果)。【讨论】:
我被其他事情分心了,放弃了这个项目。 XSTREAM 不处理更改是什么意思?如果我更改了类成员,比如说,我删除了一个属性,或者添加了一个属性,那么如果不在 xml 中,xstream 应该能够忽略那些吗?我刚试过。似乎它不能完美地处理它。 我搞定了。有一个选项 ignoreUnknonwElements();用于删除的类属性。但是,它仍然无法处理新添加的属性,并且尽管它可能是最终的并在类中设置,但它始终为空。我可以忍受它,因为没有其他工具可以做到这一点。【参考方案7】:到目前为止,我还没有使用过 Simple 框架。
根据我使用 Xstream 的经验。它在 XML 上运行良好。但是,对于 JSON,当我尝试序列化包含 Hashtable 列表的 bean 时,结果并不像预期的那样精确。
【讨论】:
现在我不需要做 JSON 的事情。顺便说一句,我尝试了 Simple 和 XStream。两者都给了我想要的结果。但我坚持使用 XStream,我猜是因为它很受欢迎。 :) 无论如何谢谢。【参考方案8】:我还建议Simple,看看tutorial,在那里自己决定。邮件列表的响应速度非常快,您总是会得到任何问题的及时答复。
【讨论】:
谢谢,支持您的建议。【参考方案9】:我建议你看看Simple
【讨论】:
在您回复后编辑了我的问题。感谢您介绍另一件事。我在 JavaRanc 的一位朋友让我意识到 Betwixt 已有 2 年的历史,而且它只有一个提交者。所以,这对我来说是毫无疑问的。现在你可能想强调一些简单框架的领域,比如它如何更适合我。非常感谢。以上是关于XStream 或简单的主要内容,如果未能解决你的问题,请参考以下文章