Microsoft は独自のコンパクト バイナリ XML エンコーディング (MC-NBFX) を実装しました。これは、標準の XML テキスト エンコーディングよりも効率的に XML 情報セット (SOAP 要求と応答など) を伝達するための WCF 内のオプションです。
同じエンコーディングを一般的に使用したいと考えています。たとえば、大きな XML ファイルをコンパクトなバイナリ形式でディスクに保存する場合などです。
私は始めました:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(@"<Foo><Bar>abc</Bar></Foo>");
using(FileStream fs = new FileStream("c:/tmp/foo.bin", FileMode.Create))
{
using(XmlDictionaryWriter xbw = XmlDictionaryWriter.CreateBinaryWriter(fs))
{
xmlDoc.WriteTo(xbw);
}
}
これは確かに MC-NBFX 形式のファイルを出力しますが、繰り返し文字列 (要素名など) を含む XML ドキュメントをエンコードすると、それらの名前がバイナリ ファイルに複数回表示されます。
XmlDictionaryWriter のポイントは、文字列の辞書を定義して、ストリーム内の文字列を文字列 ID に置き換えることができることです。実際には 2 つのディクショナリがあり、1 つは CreateBinaryWriter() に渡すことができ、事前定義された/静的なディクショナリになることを目的としています。そのような静的辞書をプラグインしようとしましたが、エンコーダーはそれを無視しています:
XmlDictionary xmlDictionary = new XmlDictionary();
xmlDictionary.Add("Foo");
xmlDictionary.Add("Bar");
using(XmlDictionaryWriter xbw = XmlDictionaryWriter.CreateBinaryWriter(fs, xmlDictionary))
{
xmlDoc.WriteTo(xbw);
}
2 番目のタイプの辞書は動的であり、おそらく書き込みプロセス中に文字列が追加されます。このメカニズムを使用するには、XmlBinaryWriterSession の使用 (およびおそらくオーバーライド) が必要です。例えば:
XmlBinaryWriterSession writerSession = new XmlBinaryWriterSession();
using(XmlDictionaryWriter xbw = XmlDictionaryWriter.CreateBinaryWriter(fs, null, writerSession))
{
xmlDoc.WriteTo(xbw);
}
繰り返しますが、これは出力には影響しません。繰り返し文字列が引き続き発生し、書き込みが完了した後、XmlBinaryWriterSession 内のディクショナリが空であることがわかります。動的辞書の内容を抽出するために XmlBinaryWriterSession をオーバーライドする必要があると予想していたので、エンコードされた XML でそれらを伝えることができます (MC-NBFX はこれをカバーしていません。必要)。
これらのクラスのドキュメントは最小限です。それらはこのように使用されることを意図していますか?もしそうなら、どこが間違っていますか?
ありがとう。