开发学院

您的位置:首页>教程>正文

教程正文

Protocol Buffer C#实例教程:编译Protocol Buffer

  现在您已经有了一个. proto,接下来您需要做的就是生成您需要读写AddressBook(以及Person和PhoneNumber)消息的类。为此,需要编译.proto:

  如果您尚未安装编译器,请从https://developers.google.com/protocol-buffers/docs/downloads.html下载软件包,并按照自述文件中的说明操作。

  现在运行编译器,指定源目录(您的应用程序的源代码所在的位置,如果不提供值,则使用当前目录)、目标目录(您希望生成的代码所在的位置;通常与$SRC_DIR相同),以及到您的. proto的路径,命令如下:

protoc -I=$SRC_DIR --csharp_out=$DST_DIR $SRC_DIR/addressbook.proto

  因为您想要C#类,所以您使用--csharp_out option选项,其他受支持的语言也提供了类似的选项。

  这将在您指定的目标目录中生成Addressbook. cs。要编译这段代码,您需要一个引用Google.Protobuf程序集。

addressbook类

  生成Addressbook.cs为您提供了五种有用的类型:

  •   一个静态地址簿类,包含关于protocol buffer消息的元数据。

  •   具有只读People属性的通讯簿类。

  •   具有姓名、身份证、电子邮件和电话属性的个人类。

  •   一个电话号码类,嵌套在静态人员中。类型类。

  •   PhoneType枚举,也嵌套在Person.Types中

  您可以阅读更多关于C#生成代码指南中确切生成内容的细节,但是在大多数情况下,您可以将这些内容视为非常普通的C#类型。需要强调的一点是,对应于重复字段的任何属性都是只读的。您可以向集合中添加项目或从中删除项目,但不能用完全独立的集合替换它。重复字段的集合类型始终是重复字段<T>。这种类型类似于列表<T>,但是有一些额外的便利方法,例如添加重载接受项目集合,用于集合初始值设定项。

  以下是如何创建Person实例的示例:

Person john = new Person
{
    Id = 1234,
    Name = "John Doe",
    Email = "jdoe@example.com",
    Phones = { new Person.Types.PhoneNumber { Number = "555-4321", Type = Person.Types.PhoneType.HOME } }
};

  请注意,在C# 6中,您可以使用使用静态来移除Person.Types ugliness:

// Add this to the other using directives
using static Google.Protobuf.Examples.AddressBook.Person.Types;
...
// The earlier Phones assignment can now be simplified to:
Phones = { new PhoneNumber { Number = "555-4321", Type = PhoneType.HOME } }