开发学院

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

教程正文

Protocol Buffer C#实例教程:定义协议格式

  要创建地址簿程序,您需要从. proto文件开始。. proto文件中的定义很简单:为要序列化的每个数据结构添加一条消息,然后为消息中的每个字段指定一个名称和类型。在我们的例子中。定义消息的原型文件是addressbook.proto。

  .proto文件以包声明开始,这有助于防止不同项目之间的命名冲突。

syntax = "proto3";
package tutorial;

import "google/protobuf/timestamp.proto";

  在C#中,如果没有指定csharp_namespace,您生成的类将被放置在与包名匹配的命名空间中。在我们的示例中,已经指定了csharp_namespace选项来覆盖默认值,因此生成的代码使用了Google.Protobuf.Examples.AddressBook。

option csharp_namespace = "Google.Protobuf.Examples.AddressBook";

  接下来,你要定义消息,消息是包含一组类型化字段的集合。许多标准的简单数据类型作为字段类型可用,包括bool、int32、float、double和string。您还可以通过使用其他消息类型作为字段类型来为消息添加进一步的结构。

message Person {
  string name = 1;
  int32 id = 2;  // Unique ID number for this person.
  string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }

  repeated PhoneNumber phones = 4;

  google.protobuf.Timestamp last_updated = 5;
}

// Our address book file is just one of these.
message AddressBook {
  repeated Person people = 1;
}

  在上面的示例中,Person消息包含PhoneNumber消息,而AddressBook消息包含Personaa消息。您甚至可以定义嵌套在其他消息中的消息类型:如您所见,PhoneNumber类型是在Person中定义的。如果您希望某个字段具有预定义的值列表之一,也可以定义枚举类型——在这里,您希望指定电话号码可以是MOBILE, HOME或WORK.。

  每个元素上的 " = 1", " = 2"标记字段在二进制编码中使用的唯一“tag”。标签号1-15需要比更高的数字少一个字节来编码,因此作为一种优化,您可以决定将那些标签用于常用或重复的元素,而将标签号16和更高的用于不常用的可选元素。重复字段中的每个元素都需要重新编码标签号,因此重复字段是这种优化的特别好的候选者。

  如果未设置字段值,则使用默认值:数字类型为零,字符串为空字符串,布尔值为假。对于嵌入式消息,默认值始终是消息的“default instance”或“prototype”,其中没有设置任何字段。调用访问器来获取尚未显式设置的字段的值总是返回该字段的默认值。

  如果重复一个字段,该字段可以重复任何次数(包括零)。重复值的顺序将保留在协议缓冲区中。将重复字段视为动态大小的数组。

  您将在Protocol Buffer语言指南中找到完整的.proto文件编写指南,包括所有可能的字段类型。不过,不要去寻找类似于类继承的工具:Protocol Buffer不会这样做。