使用 MC-NBFX 对 XML Infoset 进行压缩二进制编码?

red*_*alx 5 .net xml wcf binary-xml

Microsoft 实现了他们自己的紧凑二进制 XML 编码 (MC-NBFX),这是 WCF 中的一个选项,用于比标准 XML 文本编码更有效地传送 XML 信息集(例如 SOAP 请求和响应)。

我想使用相同的编码,例如以紧凑的二进制形式将大型 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这确实输出了一个 MC-NBFX 格式的文件,但是如果我用重复的字符串(例如元素名称)对 XML 文档进行编码,这些名称会在二进制文件中多次出现。

XmlDictionaryWriter 的要点在于它允许定义字符串字典并用字符串 ID 替换流中的字符串。实际上有两个字典,一个可以传递给 CreateBinaryWriter() 并且旨在成为预定/静态字典。我尝试插入这样一个静态字典,但编码器忽略了它:

XmlDictionary xmlDictionary = new XmlDictionary();
xmlDictionary.Add("Foo");
xmlDictionary.Add("Bar");

using(XmlDictionaryWriter xbw = XmlDictionaryWriter.CreateBinaryWriter(fs, xmlDictionary))
{
    xmlDoc.WriteTo(xbw);
}
Run Code Online (Sandbox Code Playgroud)

第二种类型的字典是动态的,据说在编写过程中添加了字符串。要使用此机制,需要使用(并且可能覆盖)XmlBinaryWriterSession。例如:

XmlBinaryWriterSession writerSession = new XmlBinaryWriterSession();
using(XmlDictionaryWriter xbw = XmlDictionaryWriter.CreateBinaryWriter(fs, null, writerSession))
{
    xmlDoc.WriteTo(xbw);
}
Run Code Online (Sandbox Code Playgroud)

同样,这对输出没有影响,仍然会出现重复的字符串,并且在写入完成后 XmlBinaryWriterSession 中的字典看起来是空的。我希望必须覆盖 XmlBinaryWriterSession 以提取动态字典的内容,以便我可以用编码的 XML 传达这些内容(MC-NBFX 不包括这一点,我很高兴自己对字典进行编码,如果必要的)。

这些类的文档很少。它们是否打算以这种方式使用,如果是这样,我哪里出错了?

谢谢。