使用MC-NBFX的XML Infoset的紧凑二进制编码?

时间:2013-12-19 13:20:23

标签: .net xml wcf binary-xml

Microsoft实现了自己的紧凑二进制XML编码(MC-NBFX),这是WCF中用于​​比标准XML文本编码更有效地传送XML Infosets(例如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。 E.g:

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

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

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

感谢。

0 个答案:

没有答案