使用带有protobuf-csharp-port的文件记录和重放人类可读的protobuf消息

时间:2012-09-12 22:34:38

标签: c# protocol-buffers

我正在使用protobuf-csharp-port,我需要能够记录一些protobuf消息以便稍后重播。 XML对我来说是理想的,但只要人类可以进入文件,进行更改,然后重播文件中的消息,我就会灵活。

使用此C#代码:

        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消息?

2 个答案:

答案 0 :(得分:1)

  

回到我的问题:有没有办法从文件中读取多个人类可读的protobuf消息?

您当前正在创建包含多个根元素的单个文本文件 - 它不是有效的XML文件。

最简单的方法可能是创建一个包含所有请求的XML文档,然后加载它(例如使用LINQ to XML)并在每个根元素的子元素上创建一个XmlReader。这些XmlReader对象中的每一个都应该能够反序列化为单个protobuf消息。

答案 1 :(得分:0)

您可以查看Protocol buffer Editor

另外还有Google自己的Text格式,有点像JSon。您可以使用protoc命令在2之间进行转换(查看编码/解码选项,还需要原型定义)