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 不涵盖这一点,我很高兴自己编码字典如果必要的)。
这些类的文档很少。它们是否打算以这种方式使用,如果是这样,我哪里错了?
谢谢。