【问题标题】:Record and replay human-readable protobuf messages using a file with protobuf-csharp-port使用带有 protobuf-csharp-port 的文件记录和重放人类可读的 protobuf 消息
【发布时间】:2012-09-12 22:34:37
【问题描述】:

我正在使用 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 消息?

【问题讨论】:

    标签: c# protocol-buffers


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      你可以看看Protocol buffer Editor

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

      【讨论】:

      • 有趣。如果我们使用 Java,我会很想仔细观察。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多