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

时间:2014-08-22 16:17:39

标签: c# .net protocol-buffers

我正在使用protobuf-csharp-port库来编写和阅读文本消息。

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

我使用以下代码创建人员目录文本文件。

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"
}

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

此外,当尝试使用以下代码读取此文件时,出现错误"协议消息标记的线路类型无效。"

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

1 个答案:

答案 0 :(得分:1)

在搜索了一些关于此错误的更多内容之后,我根据StackOverflow上的问题答案找到了解决问题的方法。

为了其他任何尝试做同样事情的人的利益,我在下面发布我的解决方案。

我使用类似的方法来获得解决方案作为下面SO问题的答案 Protobuf error:Protocol message tag had invalid wire type

因此,在我的情况下,以protobuff格式回读人文本文件的代码将是:

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();
}