开发学院,分享开发教程和最新动态
章节列表 什么是ProtobufProtobuf3 定义数据类型Protobuf3 标量值类型Protobuf3 缺省值Protobuf3 枚举Protobuf3 使用其他消息类型Protobuf3 嵌套类型Protobuf3 更新消息类型Protobuf3 未知字段Protobuf3 Any类型Protobuf3 OneofProtobuf3 MapsProtobuf3 包Protobuf3 定义服务Protobuf3 JSON映射Protobuf3 可选项Protobuf3 生成属于自己的类Protobuf 风格指南Protobuf 编码(1)Protobuf 编码(2)Protobuf 编码(3)Protobuf 技术Protocol Buffer C++实例教程: 为什么使用Protocol Buffer?Protocol Buffer C++实例教程: 定义协议格式Protocol Buffer C++实例教程: 编译Protocol BufferProtocol Buffer C++实例教程: Protocol Buffer APIProtocol Buffer C++实例教程: 发送消息Protocol Buffer C++实例教程: 读取消息Protocol Buffer C++实例教程: 扩展Protocol BufferProtocol Buffer C++实例教程: 优化技巧和高级用法Protocol Buffer C#实例教程: 前言Protocol Buffer C#实例教程:定义协议格式Protocol Buffer C#实例教程:编译Protocol Buffer Protocol Buffer C#实例教程:解析和序列化Protocol Buffer Go实例教程:前言Protocol Buffer Go实例教程:定义协议格式Protocol Buffer Go实例教程:编译Protocol BufferProtocol Buffer Go实例教程:读写消息Protocol Buffer JAVA实例教程:前言Protocol Buffer JAVA实例教程:定义协议格式Protocol Buffer JAVA实例教程:编译Protocol BufferProtocol Buffer JAVA实例教程:Protocol Buffer APIProtocol Buffer JAVA实例教程:写消息Protocol Buffer JAVA实例教程:读消息Protocol Buffer JAVA实例教程:扩展Protocol BufferProtocol Buffer Python实例教程:前言Protocol Buffer Python实例教程:定义消息格式Protocol Buffer Python实例教程:编译Protocol BufferProtocol Buffer Python实例教程:Protocol Buffer APIProtocol Buffer Python实例教程:写消息Protocol Buffer Python实例教程:读取MessageProtocol Buffer Python实例教程:扩展Protocol Buffer

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