使用protobuff-csharp端口读取protobuff文本文件

本文关键字:protobuff 文本 文件 读取 protobuff-csharp 使用 | 更新日期: 2023-09-27 18:19:04

我使用protobuf-csharp-port库在文本中写入和读取消息。

我能够使用以下代码在文本中编写消息,但我无法找到如何将此消息读取回原型buff类型定义的任何示例。

我使用下面的代码来创建person目录文本文件。

Person p1 = Person.CreateBuilder().SetId(1).SetName("Person1").Build();
Person p2 = Person.CreateBuilder().SetId(2).SetName("Person2").Build();
PeopleDir pd = PeopleDir.CreateBuilder().AddPerson(p1).AddPerson(p2).Build();
File.AppendAllText(@"C:'PersonDirectory.txt", pd.ToString());

文本文件现在看起来如下

Person {
  Id: 1
  Name: "Person1"
}
Person {
  Id: 2
  Name: "Person2"
}

我现在如何将此文本数据读取回Person定义?

此外,当尝试使用以下代码读取此文件时,我得到一个错误"协议消息标记具有无效的连线类型"。

using (Stream inputStream = new FileStream(@"C:'PersonDirectory.txt", FileMode.Open, FileAccess.Read))
{
    PeopleDir pd = PeopleDir.CreateBuilder().MergeFrom(inputStream).Build();
}

使用protobuff-csharp端口读取protobuff文本文件

在谷歌上搜索了更多关于这个错误的信息后,我找到了一个基于StackOverflow问题答案的解决方案。

为了帮助其他想要做同样事情的人,我在下面发布了我的解决方案。

我用了一个类似的方法来得到下面问题的答案Protobuf错误:协议消息标签有无效的连线类型

在我的例子中,读取protobuff格式的person文本文件的代码是:

using (TextReader inputStream = new StreamReader(new FileStream(@"C:'PersonDirectory.txt", FileMode.Open, FileAccess.Read), Encoding.ASCII))
{
                PersonDir.Builder personDirBuilder = PersonDir.CreateBuilder();
                TextFormat.Merge(inputStream, personDirBuilder);
                PersonDir pd = personDirBuilder.Build();
}