Protocol Buffer 基础语法

<aside> 💡 首先可以看下参考里的 Protocol Buffer 基础文档

</aside>

对比关系

.proto 文件在转换之后,会生成两种类型的文件,一个是以 .pd.ts/js 结尾的,生成所有Request Response 或其他需要构造出的Message 类.

在转换后的文件中,不难看出两者的对应关系: Typesctipt, Protocol Buffer语法有一定的相似性,大概为这样:

Proto TS 描述
message interface 定义消息体,提供给rpc服务使用
service class 定义服务,需要在service中定义rpc方法,再传入message,必须return 一个响应体
repeated Array<T> 可重复字段次数
string string
int32/int64 number
enum enum
Map Map Map 字段和 repeated冲突,不能同时使用,map类型需要设置键和值的类型

需要注意的点:

生成结构

在生成后的.ts 代码中,大致结构类似这种:

message User {
  int64 id = 1;
	...
  repeated EducationalExperience educational_experience = 34;
	...
  repeated WorkExperience work_experience = 36;
	...
  AdditionalMaterials additional_materials = 38;
	...
	repeated Group groups = 44;

  Job job = 45; // 紫色字体的为 Message
}
export class User extends jspb.Message {
  getId(): number;
  setId(value: number): User;

  getExperienceList(): Array<EducationalExperience>;
  setExperienceList(value: Array<EducationalExperience>): User;

  serializeBinary(): Uint8Array;
  toObject(includeInstance?: boolean): User.AsObject;
  static toObject(includeInstance: boolean, msg: User): User.AsObject;
  static serializeBinaryToWriter(message: User, writer: jspb.BinaryWriter): void;
  static deserializeBinary(bytes: Uint8Array): User;
  static deserializeBinaryFromReader(message: User, reader: jspb.BinaryReader): User;
}

export namespace User {
  export type AsObject = {
    id: number,
		...
    educationalExperienceList: Array<EducationalExperience.AsObject>,
  }
}

可以看出,每一个Message 都会生成一个Class和一个namespace , 分别对应的是: