首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于选择不同的二进制xml工具的建议

关于选择不同的二进制xml工具的建议
EN

Stack Overflow用户
提问于 2011-05-05 01:27:07
回答 3查看 2.1K关注 0票数 2

我的要求是将xml文件压缩成二进制格式,在我开始解析它之前传输并解压缩(快速减轻)。

有很多二进制xml协议和工具可用。我发现EXI (高效的xml交换)比其他的更好。试用了它的开源版本Exificient,发现它很好用。

我听说过google protocol buffer和facebook的节俭,谁能告诉我这两个能不能完成我想要的工作?

或者,如果有比EXI更好的东西,请告诉我。

此外,还有一个很好的XML解析器VTD-XML (我还没有尝试过,只是在谷歌上搜索并阅读了一些文章),与DOM、SAX和Stax相比,它实现了更好的解析性能。

我想要两全其美,最佳的压缩+最佳的解析性能,有什么建议吗?

关于EXI的另一件事是,EXI如何声称能够快速解析已解码的XML文件?因为它是由DOM、SAX或STax解析的?如果有另一个二进制解析器来读取解码的版本,我会相信这是真的。如果我错了,请纠正我。

另外,有没有什么好的针对EXI格式的C++开源实现?EXIficient提供了一个C++版本,但我找不到java的开源实现?

agile delta也有一个,但这是商业性质的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-05 02:08:49

您提到protocol buffers (Protocol but );这是一种二进制格式,但与XML没有直接关系。在partiular中,没有对成员名称(元素名称/属性名称/名称空间)进行编码-它只是对数据进行编码()(带有标识符的数字标记)。

因此,除非你已经知道如何映射"field 3“等,否则你不能从一个protobuf流重构任意的XML。

然而!如果您有一个同时使用XML和protobuf的对象模型,那么转换就很简单了;使用任意一个进行反序列化-使用任意一个进行序列化。这项工作的效果取决于实现;例如,使用protobuf-net很简单,实际上也是我执行codegen的方式(加载二进制文件;编写为XML;通过xslt层运行XML以发出代码)。

如果您实际上只想传输对象数据(而XML只是一个提议的实现细节),那么我强烈建议使用与平台无关的、广泛的实现、版本容限、非常小的输出和非常快速的读写处理。

票数 3
EN

Stack Overflow用户

发布于 2011-05-15 06:19:15

纳迪姆

这些是非常好的问题。您可能是这个领域的新手,但是XML老手经常会问同样的问题。我将尝试解决他们中的每一个。

我听说过google protocol buffer和facebook的节俭,谁能告诉我这两个能不能完成我想要的工作?

正如Marc所提到的,Protocol Buffers和Thrift是二进制数据格式,但它们不是为传输XML数据而设计的XML格式。例如,它们不支持名称空间、属性等XML概念,因此在XML和这些二进制格式之间进行映射需要您做大量的工作。

或者只要让我知道有什么比EXI更好的,我应该寻找。

EXI可能是您最好的选择。W3C完成了对XML格式实现的全面分析,发现EXI实现(高效的XML)始终达到最好的紧凑性,并且是最快的实现之一。他们还发现,它始终实现了比GZIP压缩更好的紧凑性,甚至比ASN.1per(参见W3C EXI Evaluation)这样的压缩二进制格式更好。其他XML格式都不能做到这一点。在我看到的比较EXI和Protocol Buffers的测试中,EXI至少要小2-4倍。

我想要两全其美,最好的压缩+最好的解析性能,有什么建议吗?

如果这是一种选择,您可能会考虑商业产品。上面提到的W3C EXI测试使用了Efficient XML,它比EXIficient快得多(有时解析速度快10倍,序列化速度快20倍)。您的里程数可能会有所不同,因此如果可以的话,您应该自己测试它。

关于EXI的另一件事,EXI如何宣称能够快速解析已解码的

文件?

EXI比XML更小且解析速度更快的原因是,EXI可以通过标准XML直接流入/流出内存,而无需以中间XML格式生成数据。因此,不是通过标准API将数据序列化为XML,而是压缩XML,发送压缩的XML,在另一端解压XML,然后通过其中一个XML解析它。您可以通过标准XML API将数据直接序列化为EXI,发送EXI,然后通过另一端的XML API直接解析EXI。这是压缩和EXI之间的根本区别。EXI本身不是压缩--它是一种更有效的XML格式,可以直接在应用程序之间进行流式传输。

希望这能有所帮助!

票数 3
EN

Stack Overflow用户

发布于 2011-05-05 12:26:31

压缩与EXI格式的语法系统是统一的。当您让解码器处理EXI流时,解码器API通常会为您提供一系列事件,例如SAX事件,但是,解码器不会在内部将EXI转换回XML文本以提供给另一个解析器。相反,解码器执行所有复杂的解压缩/扫描过程,以生成诸如SAX之类的API事件序列。因为EXI和XML在事件级别上是兼容的,所以在给定事件序列的情况下写出XML文本是相当简单的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5887400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档