5

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);
    }
}

这确实输出了一个 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);
}

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

XmlBinaryWriterSession writerSession = new XmlBinaryWriterSession();
using(XmlDictionaryWriter xbw = XmlDictionaryWriter.CreateBinaryWriter(fs, null, writerSession))
{
    xmlDoc.WriteTo(xbw);
}

同样,这对输出没有影响,仍然会出现重复的字符串,并且 XmlBinaryWriterSession 中的字典在写入完成后被视为空。我期望必须重写 XmlBinaryWriterSession 才能提取动态字典的内容,这样我就可以用编码的 XML 来传达那些内容(MC-NBFX 不涵盖这一点,我很高兴自己编码字典如果必要的)。

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

谢谢。

4

0 回答 0