protobuf

cnblogs 2024-06-17 08:09:02 阅读 52

模板

syntax="proto3";//指定protobuf的版本

packageexample;//定义包名

//导入其他protobuf文件

import"google/protobuf/timestamp.proto";

import"other_package/other_file.proto";

//定义一个枚举类型

enumState{

UNKNOWN=0;//枚举值必须从0开始

STARTED=1;

RUNNING=2;

STOPPED=3;

}

//定义一个消息类型

messagePerson{

//定义一个字符串字段

stringname=1;//字段编号必须是唯一的正整数

//定义一个整型字段

int32id=2;//这里的2是字段编号

//定义一个布尔字段

boolhas_pony=3;

//定义一个浮点字段

floatsalary=4;

//定义一个枚举字段

Statestate=5;

//定义一个重复字段(类似于列表)

repeatedstringemails=6;

//定义一个嵌套消息

messageAddress{

stringline1=1;

stringline2=2;

stringcity=3;

stringcountry=4;

stringpostal_code=5;

}

//定义一个嵌套消息字段

Addressaddress=7;

//定义一个map字段(类似于字典)

map<string,string>phone_numbers=8;

//定义一个任意类型字段

google.protobuf.Anyany_field=9;

//定义一个时间戳字段

google.protobuf.Timestamplast_updated=10;

//定义一个从其他文件导入的消息类型字段

other_package.OtherMessageother_field=11;

//定义一个oneof字段,可以设置其中一个字段

oneoftest_oneof{

stringname=12;

int32id=13;

boolis_test=14;

}

}

//定义一个服务

serviceExampleService{

//定义一个RPC方法,请求类型为GetPersonRequest响应类型为Person

rpcGetPerson(GetPersonRequest)returns(Person);

}

//定义GetPersonRPC方法的请求消息类型

messageGetPersonRequest{

int32person_id=1;

}

特别注意

  1. 字段编号一旦被分配后就不应更改,为了保持向后兼容性
  2. 编号在[1,15]范围内的字段编号在序列化时只占用一个字节。因此,为了优化性能,对于频繁使用的字段,尽可能使用该范围内的数字。同时也要为未来可能添加的常用字段预留一些编号(不要一股脑把 15 之内的编号都用了!)
  3. 字段号19000,19999是为 Protocol Buffers 实现保留的。
  4. 保留字段:如果你通过完全删除字段或将其注释来更新消息类型,则未来其他开发者对类型进行自己的更新时就有可能重用字段编号。当旧版本的代码遇到新版本生成的消息时,由于字段编号的重新分配,可能会引发解析错误或不预期的行为。为了避免这种潜在的兼容性问题,protobuf 提供reserved关键字来明确标记不再使用的字段编号或标识符,如果将来的开发者尝试使用这些标识符,proto 编译器将会报错提醒。

message Foo {

reserved 2, 15, 9 to 11, 40 to max;

// 9 to 11 表示区间 [9,11], 40 to max 表示区间 [40, 编号的最大值]

reserved "foo", "bar";

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。