首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用包含protobuf-csharp-port的文件记录和重放人类可读的protobuf消息

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

Stack Overflow用户
提问于 2012-09-13 06:34:38
回答 2查看 994关注 0票数 1

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

使用以下C#代码:

代码语言:javascript
复制
        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文件:

代码语言:javascript
复制
<str>Lafayette</str>
<str>Lafayette</str>
<str>Lafayette</str>

但是,当我尝试使用以下命令反序列化它们时:

代码语言:javascript
复制
        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。)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-13 06:38:01

所以回到我的问题上:有什么方法可以从一个文件中读取多个人类可读的协议消息吗?

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-09-13 15:51:57

您可以查看Protocol buffer Editor

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12397051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档