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

时间:2011-05-04 17:27:07

标签: xml-serialization binary protocol-buffers thrift exi

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

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

我听说过google协议缓冲区和facebook的节俭,任何人都可以告诉我这两个是否可以完成我正在寻找的工作?

或者只是让我知道是否有更好的东西,那么我应该寻找EXI。

此外,与DOM,SAX和Stax相比,有一个很好的XML解析器VTD-XML(没有尝试过,只是用Google搜索并阅读了一些文章),它们可以实现更好的解析性能。

我想要两全其美,最佳压缩+最佳解析性能,任何建议?

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

另外,EXI格式有没有很好的C ++开源实现? EXIficient提供了java版本,但我无法发现C ++开源实现?

敏捷三角洲有一个,但那是商业化的。

3 个答案:

答案 0 :(得分:3)

你提到协议缓冲区(protobuf);这是一种二进制格式,但与XML没有直接关系。在partiular中,没有成员名称(元素名称/属性名称/名称空间)被编码 - 它是 只是 数据(带有标识符的数字标记)。

因此,除非您已经知道如何映射“字段3”等,否则无法从protobuf流重建任意XML。

然而!如果你有一个同时使用XML和protobuf的对象模型,那么转换是微不足道的;用任何一个反序列化 - 用任何一个序列化。这项工作的效果取决于实施情况;例如,使用protobuf-net是微不足道的,实际上我是如何处理codegen的(加载二进制文件;写为XML;通过xslt层运行XML以发出代码)。

如果您实际上只想传输 对象数据 (并且XML只是一个建议的实现细节),那么我会彻底推荐protobuf;独立于平台,广泛的实现,版本容错,非常小的输出,以及读取和写入时的非常快速的处理。

答案 1 :(得分:3)

纳迪姆,

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

  

我听说谷歌协议缓冲区和Facebook的节俭,任何人都可以告诉我这两个是否可以完成我正在寻找的工作?

如Marc所述,Protocol Buffers和Thrift是二进制数据格式,但它们不是用于传输XML数据的XML格式。例如,他们不支持名称空间,属性等XML概念,因此XML和这些二进制格式之间的映射需要您做一些相关的工作。

  

或者只是让我知道是否有更好的东西,那么EXI我应该寻找。

EXI可能是你最好的选择。 W3C完成了对XML格式实现的全面分析,发现EXI实现(Efficient XML)始终如一地实现了最佳的紧凑性,并且是最快的。他们还发现它始终比GZIP压缩具有更好的紧凑性,甚至包括ASN.1 PER等二进制格式(参见W3C EXI Evaluation)。没有其他XML格式能够做到这一点。在我看到的比较EXI和Protocol Buffers的测试中,EXI至少要小2-4倍。

  

我想要两全其美,最佳压缩+最佳解析性能,任何建议?

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

  

关于EXI还有一件事,EXI如何声称能够快速解析解码后的XML文件?

EXI可以比XML更小,更快解析的原因是因为EXI可以通过标准XML API直接传输到内存或从内存流式传输,而不会以中间XML格式生成数据。因此,不是通过标准API将数据序列化为XML,压缩XML,发送压缩XML,在另一端解压缩XML,然后通过其中一个XML API解析,...您可以直接序列化数据作为EXI通过标准XML API,发送EXI,然后直接通过另一侧的XML API之一解析EXI。这是压缩和EXI之间的根本区别。 EXI本身不是压缩 - 它是一种更高效的XML格式,可以直接传输到应用程序或从应用程序流式传输。

希望这有帮助!

答案 2 :(得分:0)

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