13

W3 的 EXI(高效 XML 交换)将被标准化。它声称是“最后一个二进制标准”。

它是一种存储 XML 数据的标准,针对处理和存储进行了优化,与 XML 模式捆绑在一起(使数据具有强类型和强结构化)。好吧,有很多声称的优势。处理和内存效率测量给我留下了最深刻的印象。

我在问自己,所有已建立的 XML API 会发生什么?

有一段与我的问题有关:

4.2 现有的 XML 处理 API

由于 EXI 是 XML Infoset 的编码,EXI 实现可以支持任何用于 XML 处理的常用 XML API,因此 EXI 对现有 XML API 没有直接影响。但是,使用现有的 XML API 还需要将 EXI 文档中出现的所有名称和文本转换为字符串。将来,如果更高层可以直接使用这些数据作为出现在 EXI 文档中的类型值,则可以实现更高的效率。例如,如果更高层需要类型化数据,则通过其字符串形式会产生性能损失,因此直接支持类型化数据的扩展 API 可以在与 EXI 一起使用时提高性能。

来自:http ://www.w3.org/TR/exi-impacts/

我将其理解为:“将 EXI 与现有 API 一起使用?没有性能提升!(除非你全部重写)”

我们以 Java 生态系统为例:

我们在最新的 JDK 6 中有大量的 XML API(随着每个主要的 JDK 版本,越来越多的它们被添加。)据我所知,它们中的大多数(如果不是全部)都使用内存中的 DOM 树,或序列化(“文本”)表示来转换/处理/验证/... XML 数据。

你们怎么看,随着 EXI 的引入,这些 API 会发生什么?

谢谢大家的意见。

对于那些不知道 EXI 的人:http: //www.w3.org/XML/EXI/

4

5 回答 5

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 报告的出色性能所必需的。

于 2009-12-14T21:48:00.793 回答
4

让我们将 EXI 视为“更好的 XML GZIP”。仅供参考,它对 API 没有影响,因为您仍然可以使用所有 API(DOM、SAX、StAX、JAXB ...)。只有这样才能获得 EXI,您必须获得一个写入它的流写入器或读取它的流读取器。

执行 EXI 的最有效方法是 StAX。但确实有可能因为 EXI 而出现新的 API。但是谁说 DOM 是高效且为现代语言设计的 ;-)

如果您正在处理大型 XML 文件(其中一些文件只有数百 MB),那么您肯定知道为什么需要 EXI :节省大量空间,节省大量内存和处理时间。

这与 HTTP Content-Encoding 的目的没有什么不同:您不需要使用它,只是如果双方都理解它,这是执行交换的一种非常有效的方式。

顺便说一句,由于 SOAP 膨胀,EXI 将成为通过 HTTP IMHO 对任何 XML 进行内容添加的首选方式 ;-) 一旦 EXI 安装在浏览器上,它也可以使任何最终用户受益:更快的传输、更快的分析 = 最佳体验永远为同一台机器!

EXI 不弃用字符串表示,只是让它有点不同。哦,顺便说一句,在执行 UTF 时(例如,考虑默认 UTF8),您已经对 32 位 unicode 代码点使用“压缩编码”......这意味着,在线数据与真实数据不同已经 ;-)

于 2009-07-17T08:07:30.913 回答
3

我现在正在处理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 是为了不定义任何一个。现在我有点不公平,因为我包含了分隔符——完全没有必要的分隔符。

我现在明白这是如何工作的了。这是规格:

https://www.w3.org/TR/exi/

祝你阅读愉快!这对我来说很有趣!!!!@@##!@

现在这只是一个模式,EXI 规范特别指出您仍然可以对不符合模式的 XML 进行编码。这很有趣,因为这应该适用于小型 Web 设备。您如何处理无法在嵌入式设备中处理的意外数据?

为什么,你当然会死。对于您不期望的事情,无法恢复。这些东西不是有屏幕的,能通过串口登录就已经很幸运了。

我使用了 4 个不同的 XSD 生成器/解析器/XML 生成器。其中 3 个被我必须使用的 Schema 卡住了。C 和 C++ 的数据封送处理(请记住,这是针对内存和 CPU 资源很少的嵌入式系统)非常糟糕。

XSD 基本上描述了一种结构或类体系结构,我找不到一个工具可以只创建类。我上面给出的 XSD 示例应该创建一个具有 4 个布尔值的结构,2 个布尔值是值,2 个布尔值表示它们是否已定义。

但那存在吗?好吧,不。

我喜欢 XML,用于描述文档。我真的这样做了——但这就是我讨厌 XML 的地方——对于一个被广泛采用的标准,可用的工具绝对是糟糕的。当架构分布在多个命名空间和文档中时,仅读取架构是一件困难的事情。

吐槽吐槽

我们使用它的唯一原因是某些标准委员会坚持使用它。它所做的是为一小部分已经实施这一点的公司创造了垄断地位,这是唯一的目的。

EXI 不是一个被广泛采用的标准,XML 是一个糟糕的数字数据封装器,实现它很痛苦,而且没有合适的工具。EXIP 的版本是 5.0 - 任何开源的东西都是 Java 的 - 至少我有。

对于我的工作领域,EXI 只是一个糟糕的设计决策。我在各种嵌入式系统上研究了大量的通信协议。我在 DOCSIS 工作,所有现代有线调制解调器都使用它——它们使用简单且可扩展的类型/长度/值协议,并提供处理无法识别的类型的规定——这就是为什么总是包含长度的原因。这很简单,实现整个堆栈实际上需要几天时间。

EXI 很难编写代码,没有像样的处理器,最糟糕的是,我发现的所有处理器都可以很好地使用它,只需从 EXI<->XML 转换它——这完全没用。

我已经求助于编写自己的 XSD 解析器,这意味着我必须至少了解该设计中使用它的那些部分的整个 XML 规范——而且范围很广。任何合理的规格都需要我 2 周的时间,我花了 10 年。我的世界上没有人会使用它,除非它被塞进他们的喉咙而且他们不应该,它是一个圆孔的方形钉。

于 2016-06-28T19:58:23.913 回答
2

我个人宁愿根本不使用 EXI。似乎它把所有关于 XML 的笨拙、坏的东西都塞进了二进制格式,这基本上消除了 XML(纯文本格式)的优势。

似乎行业的总体趋势是转向更轻量级的数据传输模型(例如 HTTP REST),并远离像 SOAP 这样的重量级模型。就个人而言,我对二进制 XML 的想法并不十分兴奋。

任何声称是“最后一个二进制标准”的东西都可能是错误的。

于 2009-03-25T00:01:57.857 回答
2

EXI 的问题在于它需要从您的应用程序代码中抽象出来。我在一个中间件产品上工作,其中 XML 的人类可读性在某些方面(日志记录、故障查找等)是关键,但在其他方面可以牺牲(内部应用程序之间的通信以限制 I/O 负载)。

我们目前使用 SOAP 在或拥有客户端、中间件和供应商 Web 应用程序之间进行通信。我想用 EXI 替换它,同时在其他领域保留人类可读的 XML。为了用 EXI 替换 SOAP 通信,我需要:

  1. 等到 EXI 被合并到现有的 SOAP 堆栈(Axis/SAAJ)中,或者
  2. 在 EXI 之上用我自己的 SOAP-ish 协议替换我现有的 Axis/SAAJ SOAP 客户端/供应商实现

JSON 和 EXI 之间的比较是公平的,但两者的用例不同。JSON 的元数据没有标准,而 XML 有 XML-Schema。对于 XML,有几个标准机构定义了特定行业的数据交换模式。还有一系列建立在 XML 之上的协议/标准,例如 SOAP、XML-Signature、XML-Encryption、WS-Security、SAML 等。这对于 JSON 是不存在的。

因此,对于 B2B 消息交换和其他需要使用行业标准与外部系统集成的情况,XML 是一个更好的选择。EXI 可以为这个世界带来 JSON 的一些好处,但需要将其合并到现有的 XML API 中,然后才能被广泛采用。

于 2012-10-05T11:02:01.660 回答