Запись и воспроизведение удобочитаемых сообщений protobuf с использованием файла с protobuf-csharp-port

Я использую protobuf-csharp-port, и мне нужна возможность записывать некоторые сообщения protobuf для последующего воспроизведения. XML был бы идеальным для меня, но я гибок, пока человек может войти в файл, внести изменения, а затем воспроизвести сообщения из файла.

Используя этот код С#:

        MyRequest req =
            MyRequest.CreateBuilder().SetStr("Lafayette").Build();

        using (var stringWriter = new StringWriter())
        {
            var xmlWriterSettings = new XmlWriterSettings
                {
                    ConformanceLevel = ConformanceLevel.Fragment
                };

            var xmlWriter = XmlWriter.Create(stringWriter, xmlWriterSettings);

            ICodedOutputStream output = XmlFormatWriter.CreateInstance(xmlWriter);
            req.WriteTo(output);
            output.Flush();
            string xml = stringWriter.ToString();

            using (var streamWriter = new StreamWriter(@"Requests.txt"))
            {
                streamWriter.WriteLine(xml);
                streamWriter.WriteLine(xml);
                streamWriter.WriteLine(xml);
            }
        }

Я создаю файл Requests.txt, содержащий:

<str>Lafayette</str>
<str>Lafayette</str>
<str>Lafayette</str>

Однако, когда я пытаюсь десериализовать их обратно, используя:

        var xmlReaderSettings = new XmlReaderSettings
        {
            ConformanceLevel = ConformanceLevel.Fragment
        };

        using (var xmlReader = XmlReader.Create(@"Requests.txt", xmlReaderSettings))
        {
            ICodedInputStream input = XmlFormatReader.CreateInstance(xmlReader);
            MyRequest reqFromFile;

            while(!input.IsAtEnd)
            {
                reqFromFile =
                    ReverseRequest.CreateBuilder().MergeFrom(input).Build();
            }
        }

Только один MyRequest десериализуется, а два других игнорируются. (После того, как reqFromFile построено, input.IsAtEnd == true.)

Итак, вернемся к моему вопросу: есть ли способ прочитать несколько удобочитаемых сообщений protobuf из файла?


person OmniJeff    schedule 12.09.2012    source источник


Ответы (2)


Итак, вернемся к моему вопросу: есть ли способ прочитать несколько удобочитаемых сообщений protobuf из файла?

Что ж, сейчас вы создаете один текстовый файл с несколькими корневыми элементами — это недопустимый XML-файл.

Простейшим подходом, вероятно, было бы создание одного XML-документа со всеми этими запросами, затем загрузка его (например, с помощью LINQ to XML) и создание XmlReader, позиционированного в каждом из дочерних элементов корневого элемента. Каждый из этих объектов XmlReader должен иметь возможность десериализоваться в одно сообщение protobuf.

person Jon Skeet    schedule 12.09.2012

Вы можете воспользоваться редактором буфера протокола.

В качестве альтернативы существует собственный текстовый формат Google, который немного похож на JSon. Вы можете конвертировать между 2 с помощью команды protoc (посмотрите параметры кодирования/декодирования, вам также нужно определение proto)

person Bruce Martin    schedule 13.09.2012
comment
Интересный. Если бы мы использовали Java, у меня возникло бы желание присмотреться повнимательнее. - person OmniJeff; 13.09.2012