Компактное двоичное кодирование XML Infoset с использованием MC-NBFX?

Microsoft реализовала свою собственную компактную двоичную кодировку XML (MC-NBFX), которая является опцией в WCF для более эффективной передачи инфо-наборов XML (например, запросов и ответов SOAP), чем стандартная кодировка (ы) XML-текста.

Я хотел бы использовать ту же кодировку для общего использования, например, чтобы сохранить большой файл 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 заключается в том, что он позволяет определить словарь строк и заменить строки в потоке идентификатором строки. На самом деле есть два словаря, один из которых может быть передан в 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 не покрывает это, я рад сам кодировать словарь, если необходимо).

Документация для этих классов минимальна. Они предназначены для использования таким образом, если так, то где я иду не так?

Благодарю.

0 ответов

Другие вопросы по тегам