Сериализировать буферный файл протокола в формат xml / text - PullRequest
2 голосов
/ 10 октября 2011

Я использую буфер протокола в .net http://code.google.com/p/protobuf-net/.

Я установил версию поддержки Visual Studio, в которой я могу просто написать прототип файла в проекте, и он автоматически генерирует файлы классов csharp.

Во многих случаях мне нужно записывать файлы в файл xml (или другой текстовый формат, если доступен).Я обнаружил, что существует метод Serializer.Serialize (), который принимает параметр XmlWriter.Я пытался использовать его, но он жалуется, что определенный мной тип protobuf должен быть преобразован в system.Xml.Serialization.IXmlSerializable.

В моем случае, что я должен сделать, чтобы мой тип мог быть преобразован в System.Xml.Serialization.IXmlSerializable?Я не хочу изменять файл CS напрямую, так как он создается на лету, когда изменяется файл прото.

спасибо.

1 Ответ

2 голосов
/ 10 октября 2011

Protobuf-net не пишет xml;этот API предназначен для того, чтобы вы могли записывать данные protobuf в виде непрозрачного большого двоичного объекта (base-64) в потоке xml.Однако protobuf-net обычно очень рад разрешить параллельное использование с XmlSerializer - он учитывает большинство тех же метафор.Скорее всего, просто использование new XmlSerializer(typeof(YourRootType)) для сериализации вашего объекта будет работать нормально.Фактически, часть внутренней обработки для генерации кода из .proto опирается на эту двойственность.

Если вы хотите явных xml маркеров в вашем сгенерированном коде (т.е.[XmlType(...)] и т. Д.), Просто используйте параметр командной строки p:xml, который (если вы используете инструменты IDE) также можно достичь с помощью ;xml в «Пространстве имен пользовательских инструментов» (это действительно не так)Это очевидно, но это одно из немногих мест, где я мог бы принять дополнительные данные):

enter image description here

По сути, все, что вводится в «Пространстве имен пользовательских инструментов», предполагается (через protobuf-net) быть списком точек с запятой , начинающимся с требуемого пространства имен , за которым следуют параметры для генератора;следовательно, ;xml использует пространство имен по умолчанию , затем добавляет параметр "xml", так же, как и p:xml в командной строке.

...