W3的EXI(高效XML交换)将标准化。 它声称是“最后的二元标准”。
它是存储针对的优化XML数据的标准 处理和存储,与XML模式捆绑在一起(制作数据 强类型和强结构)。嗯,有很多 声称有优势。加工和印象最让我印象深刻 记忆效率测量。
我在问自己,所有已建立的将会发生什么 XML API?
这段与我的问题有关:
4.2现有的XML处理API
由于EXI是XML Infoset的编码,EXI实现可以支持任何常用的XML API进行XML处理,因此EXI对现有的XML API没有直接影响。但是,使用现有的XML API还要求将EXI文档中出现的所有名称和文本转换为字符串。将来,如果较高层可以直接将这些数据用作EXI文档中出现的类型值,则可以实现更高的效率。例如,如果较高层需要类型化数据,则通过其字符串形式会产生性能损失,因此直接支持类型化数据的扩展API可以在与EXI一起使用时提高性能。
我理解如下:“在现有API中使用EXI? 没有性能提升! (除非你全部重写)“
让我们以Java生态系统为例:
我们在最新的JDK 6中有很多XML API (随着每个主要的JDK版本,添加了越来越多的。) 据我所知,大多数(如果不是全部)他们都在使用 内存中的DOM树或序列化(“文本”)表示 转换/处理/验证/ ... XML数据。
你们怎么想,这些将会发生什么 引入EXI的API?
谢谢大家的意见。
对于那些不了解EXI的人:http://www.w3.org/XML/EXI/
答案 0 :(得分:5)
您不需要任何新的API来获得EXI的性能提升。 W3C进行的所有EXI测试和性能测量都使用JDK中内置的标准SAX API。有关最新测试,请参阅 http://www.w3.org/TR/exi-evaluation/#processing-results。在没有任何特殊API的情况下,EXI解析平均比这些测试中的XML快14.5倍。
有一天,如果人们认为它值得,我们可能会看到一些类型化的XML API出现。如果发生这种情况,您将从EXI获得更好的性能。但是,这并不需要像W3C报告的那样获得出色的性能。
答案 1 :(得分:4)
让我们将EXI视为“更好的GZIP for XML”。仅供参考,它对API没有任何影响,因为您仍然可以使用它们(DOM,SAX,StAX,JAXB ......)。只有这样才能获得EXI,你必须得到一个写入它的编写器或一个读取它的流读取器。
执行EXI最有效的方法是StAX。但是,由于EXI,可能会出现新的API。但谁说DOM是高效的,并且为现代语言设计得很好; - )
如果你正在处理大型XML文件(我有一些几百MB),你明确知道为什么需要EXI:节省大量空间,节省大量内存和处理时间。
这与HTTP内容编码目的没什么不同:您不需要使用它,只是如果双方都理解它,那么这是一种非常有效的方式来执行交换。
顺便说一句,EXI将成为内容 - 通过HTTP恕我直言内容加载任何XML的首选方式因为SOAP膨胀;-)一旦EXI适应浏览器,它也可以使任何最终用户受益:更快的转移,更快的分析=同一台机器的最佳体验!
EXI不会弃用字符串表示,只会使它略有不同。哦,顺便说一下,当做UTF(例如默认UTF8)时,你已经在使用32位unicode代码点的“压缩编码”......这意味着,有线数据与实际数据不一样已经; - )
答案 2 :(得分:2)
我个人宁愿不使用EXI。似乎它正在采取所有关于XML的笨重,糟糕的事情,并将它们塞进二进制格式,这基本上消除了XML(纯文本格式)的保存优雅。
似乎行业的大趋势正朝着更轻量级的数据传输模型(例如HTTP REST)发展,并逐渐远离像SOAP那样的重量级模型。就个人而言,我对二进制XML的想法并不十分兴奋。
任何声称是“最后一个二进制标准”的东西都可能是错误的。
答案 3 :(得分:2)
EXI的问题在于它需要从应用程序代码中抽象出来。我在一个中间件产品上工作,其中XML的人类可读性在某些方面是关键的(日志记录,故障查找等),但可以在其他方面牺牲(内部应用程序之间的通信以限制I / O负载)。
我们目前使用SOAP进行客户端,中间件和供应商Web应用程序之间的通信。我想用EXI替换它,同时在其他领域保留人类可读的XML。为了用EXI替换SOAP通信,我需要:
JSON和EXI之间的比较是公平的,但两者的用例是不同的。 JSON的元数据没有标准,而XML有XML-Schema。使用XML,有几个标准组织为特定行业定义数据交换模式。还有一系列基于XML构建的协议/标准,例如SOAP,XML签名,XML加密,WS-Security,SAML等。对于JSON,这不存在。
因此,对于B2B消息交换以及需要使用行业标准与外部系统集成的其他情况,XML是更好的选择。 EXI可以将JSON的一些好处带入这个世界,但是在广泛采用之前,它需要被整合到现有的XML API中。
答案 4 :(得分:2)
我现在正在与EXI打交道。
没有用于处理EXI的良好通用工具。一旦你深入了解EXI,就会发现二进制流中有一堆不必要的分隔符,这些分隔符绝对是完全没有必要的。其中一些是幽默的。
如果指定了两个值,您认为如何在EXI中编码以下内容?
<xs:complexType name="example">
<xs:sequence>
<xs:element name="bool1" type="xs:boolean" minOccurs="0" />
<xs:element name="bool2" type="xs:boolean" minOccurs="0" />
</xs:sequence>
</xs:complexType>
您认为最高可能是4位吗? 1位表示是否定义了bool1,并且bool1的值后跟另一位指示是否定义了bool2,那么bool2的值是什么?
很好,没有!
好吧,让我告诉你们男孩和女孩!这就是它实际编码的方式
+---- A value of 0 means this element (bool1) is not specified,
| 1 indicates it is specified
|+--- A value of x means this element is undefined,
|| 0 means the bool is set to false, 1 is set to true
||+-- A value of 0 means this element (bool2) is not specified,
||| 1 indicates it is specified
|||+- A value of x means this element is undefined
|||| 0 means the bool is set to false, 1 is set to true
||||
0x0x 4 0100 # neither bools are specified
0x10 8 00100000 # bool1 is not specified, bool2 is set to false
0x11 8 00101000 # bool1 is not specified, bool2 is set to true
100x 9 000000010 # bool1 is set to false, bool2 is not specified
110x 9 000010010 # bool1 is set to true, bool2 is not specified
1010 13 0000000000000 # bool1 is set to false, bool2 is set to false
1011 13 0000000001000 # bool1 is set to false, bool2 is set to true
1110 13 0000100000000 # bool1 is set to true, bool2 is set to false
1111 13 0000100001000 # bool1 is set to true, bool2 is set to true
^ ^
+-encoding--+
Which can be represented with this tree
0-0-0-0-0-0-0-0-0-0-0-0-0 (1010)
\ \ \ \ \
| | | | 1-0-0-0 (1011)
| | | |
| | | 1-0 (100x)
| | |
| | 1-0-0-0-0-0-0-0-0 (1110)
| | \ \
| | | 1-0-0-0 (1111)
| | |
| | 1-0 (110x)
| |
| 1-0-0-0-0-0 (0x10)
| \
| 1-0-0-0 (0x11)
|
1-0-0 (0x0x)
至少4位,MINIMUM以便不定义。现在我有点不公平,因为我包括分隔符 - 完全没有必要的分隔符。
我现在明白这是如何运作的。这是规范:
玩得开心!对我来说这是一个很有趣的交易!!!! @@ ##!@
现在这只是一个模式,EXI规范明确指出您仍然可以编码不符合模式的XML。这很有趣,因为这应该适用于小型小型网络设备。如果您没有在嵌入式设备中处理的意外数据,您如何处理?
为什么,你当然死了。对于你不能期待的东西,没有恢复。它不像这些东西有屏幕,我很幸运,如果我可以通过串口登录它。
我使用了4种不同的XSD生成器/解析器/ XML生成器。其中3个人在我必须使用的Schema上窒息。 C和C ++的数据封送(记住这是针对EMBEDDED系统的内存和CPU功率非常小)很糟糕。
XSD基本上描述了一种结构或类架构,我找不到一个只能创建类的工具。我上面给出的XSD示例应该创建一个具有4个bool的结构,2个bool是值,2个bool表示它们是否被定义。
但是存在吗?好吧,没有。
我喜欢XML,用于描述文档。我真的 - 但这是我讨厌的XML - 对于一个广泛采用的标准,它的可用工具是非常可怕的。当它遍布多个名称空间和文档时,只需阅读模式就很难做到。
Rant rant,huff huf
我们使用这个的唯一原因是一些标准委员会坚持这一点。它所做的是为已经实现了这一目标的一小群公司创造了垄断,这是唯一的目的。
EXI不是一个广泛采用的标准,XML对于数字数据来说是一个糟糕的封装器,实现它是一件痛苦的事情,并且没有适合它的工具。 EXIP版本为5.0 - 开源的任何东西都是用Java编写的 - 至少我有这个。
对于我的工作领域,EXI只是一个糟糕的设计决定。我在各种嵌入式系统上研究了大量的通信协议。我在所有现代有线调制解调器使用的DOCSIS上工作 - 他们使用简单,可扩展的类型/长度/值协议,其中包含处理无法识别类型的规定 - 这就是为什么总是包含长度的原因。很简单,实现整个堆栈需要几天的时间。
EXI很难处理代码,没有合适的处理器,最糟糕的是,我发现的所有处理器实际上都能很好地处理它,只需将它从EXI&lt; - &gt; XML转换 - 这是完全没用。
我已经编写了自己的XSD解析器,这意味着我必须至少了解使用它的设计部分的整个XML规范 - 而且这种规范非常广泛。我花了2个星期的时间来处理任何合理的规格,把我带走了10.我的世界上没有人会使用它,除非它被推到喉咙而且他们不应该这样做,它不是方孔钉为圆孔。