13

W3のEXI(効率的なXML交換)が標準化される予定です。それは「最後のバイナリ標準」であると主張しています。

これは、処理と保存用に最適化されたXMLデータを格納するための標準であり、XMLスキーマにバンドルされています(データを強く型付けし、強く構造化する)。さて、主張されている利点はたくさんあります。私は、処理とメモリ効率の測定に最も感銘を受けました。

確立されたすべてのXMLAPIはどうなるのでしょうか?

私の質問に関連するこの段落があります:

4.2既存のXML処理API

EXIはXMLインフォセットのエンコーディングであるため、EXI実装はXML処理に一般的に使用されるXML APIのいずれかをサポートできます。したがって、EXIは既存のXMLAPIにすぐには影響しません。ただし、既存のXML APIを使用するには、EXIドキュメントに表示されるすべての名前とテキストを文字列に変換する必要もあります。将来的には、上位層がこれらのデータをEXIドキュメントに表示される型付きの値として直接使用できるようになれば、より効率的になる可能性があります。たとえば、上位層で型付きデータが必要な場合、文字列形式を使用するとパフォーマンスが低下する可能性があるため、型付きデータを直接サポートする拡張APIを使用すると、EXIで使用した場合のパフォーマンスが向上する可能性があります。

差出人:http ://www.w3.org/TR/exi-impacts/

「既存のAPIでEXIを使用しますか?パフォーマンスは向上しません!(すべてを書き直さない限り)」と理解しています。

例としてJavaエコシステムを取り上げましょう。

最新のJDK6にはたくさんのXMLAPIがあります(主要なJDKリリースごとに、ますます多くのXML APIが追加されています)。私が判断できる限り、それらのほとんど(すべてではないにしても)はメモリ内のDOMツリーを使用しています。または、XMLデータを変換/処理/検証/ ...するためのシリアル化された(「テキスト」)表現。

EXIの導入により、これらのAPIはどうなると思いますか?

ご意見ありがとうございました。

EXIを知らない人のために:http ://www.w3.org/XML/EXI/

4

5 に答える 5

5

EXI のパフォーマンスを向上させるために、新しい API は必要ありません。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 (DOM、SAX、StAX、JAXB ...) を引き続き使用できるため、API には影響しません。EXI を取得するには、書き込みを行うストリームライターまたは読み取りを行うストリームリーダーを取得する必要があります。

EXI を実行する最も効率的な方法は StAX です。しかし、EXI によって新しい API が発生する可能性があることは事実です。しかし、DOM は効率的で、現代の言語向けに適切に設計されていると誰が言ったでしょうか ;-)

大きな XML ファイル (数百 MB のファイルをいくつか取得しました) を処理している場合は、EXI が必要な理由が明確にわかります。大量のスペースを節約し、大量のメモリと処理時間を節約できます。

これは、HTTP Content-Encoding の目的と何ら変わりはありません。使用する必要はありません。単純に、双方がそれを理解していれば、交換を実行するための非常に効率的な方法です。

ところで、EXI は、SOAP の肥大化のために、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ビットだと思いますか?bool1 が定義されているかどうかを示す 1 ビット、および 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 ビット。デリミタを含めているため、少し不公平です-まったく不要なデリミタ。

私は今、これがどのように機能するかを理解しています。仕様は次のとおりです。

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

それを読んで楽しんでください!とても楽しかったです!!!!@@##!@

現在、これはスキーマのみを使用しており、EXI 仕様では、スキーマに準拠していない XML をエンコードできると具体的に述べています。これは、小さな小さな Web デバイス用であると想定されているため、陽気です。組み込みデバイスで処理する準備が整っていない予期しないデータをどうしますか?

もちろん、あなたはただ死ぬだけです。予期しないものに対する回復はありません。これらに画面があるわけではないので、シリアル ポートからログインできれば幸いです。

4 つの異なる XSD ジェネレーター/パーサー/XML ジェネレーターを使用しました。そのうちの 3 人は、私が使用しなければならないスキーマで窒息します。C および C++ のデータ マーシャリング (メモリと CPU パワーが非常に少ない EMBEDDED システム用であることを思い出してください) はひどいものです。

XSD は基本的に構造またはクラス アーキテクチャを記述しますが、クラスを作成するだけのツールは 1 つもありません。上記の XSD の例では、4 つのブール値を持つ構造体を作成する必要があります。2 つのブール値は値であり、2 つのブール値はそれらが定義されているかどうかを示します。

しかし、それは存在しますか?いやいや。

ドキュメントを記述するための XML が好きです。本当にそう思います - しかし、XML について私が嫌いな点はここにあります - 広く採用されている標準に対して、利用可能なツールはまったくひどいものです。スキーマが複数の名前空間とドキュメントにまたがっている場合、スキーマを読み取るだけでは困難です。

暴言、ハフハフ

私たちがこれを使用している唯一の理由は、標準化委員会がそれを主張したからです。それが行ったことは、すでにこれを実装している少数の企業グループの独占を作成することです。それが唯一の目的です。

EXI は広く採用されている標準ではなく、XML は数値データのカプセル化には不十分であり、XML を実装するのは面倒であり、適切なツールはありません。EXIP はバージョン 5.0 です - オープン ソースで動作するものはすべて Java です - 少なくとも私はそれを持っています。

私の仕事の分野では、EXI は単に悪い設計上の決定です。私は、さまざまな組み込みシステムで大量の通信プロトコルに取り組んできました。私は、最新のすべてのケーブル モデムが使用する DOCSIS に取り組みました。認識されていないタイプを処理するための規定を備えた、シンプルで拡張可能な Type/Length/Value プロトコルを使用します。これが、Length が常に含まれる理由です。スタック全体を実装するには文字通り数日かかります。

EXI はコードを扱うのが非常に難しく、適切なプロセッサがありません。最悪の場合、実際にそれでうまく動作することがわかったプロセッサはすべて、EXI<->XML から変換するだけです。これはまったく役に立ちません。

私は独自の XSD パーサーを作成することに頼りました。つまり、少なくとも XML 仕様を使用するこの設計の部分について、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 を保持します。SOAP 通信を EXI に置き換えるには、次のいずれかが必要です。

  1. EXI が既存の SOAP スタック (Axis/SAAJ) に組み込まれるまで待つか、または
  2. 既存の Axis/SAAJ SOAP クライアント/サプライヤーの実装を、EXI 上の独自の SOAP っぽいプロトコルに置き換えます

JSON と EXI の比較は公平ですが、2 つのユースケースは異なります。JSON のメタデータには標準がありませんが、XML には XML スキーマがあります。XML には、特定の業界向けのデータ交換のスキーマを定義する標準化団体がいくつかあります。SOAP、XML-Signature、XML-Encryption、WS-Security、SAML など、XML の上に構築されたさまざまなプロトコル/標準もあります。これは JSON には存在しません。

したがって、XML は、B2B メッセージ交換や、業界標準を使用して外部システムと統合する必要があるその他の場合に適したオプションです。EXI は JSON の利点の一部をこの世界にもたらすことができますが、広く採用される前に既存の XML API に組み込む必要があります。

于 2012-10-05T11:02:01.660 に答える