protobuf Extensions这个东西还真蛮有用的, 这里记录一下用Extensions定义方法。
msg.proto
package ProtoCS;
enum CmdID
{
CID_MOD = 1,
}
message MsgHead
{
optional int32 cid = 1;
}
message Msg
{
optional MsgHead head = 1;
optional int32 ret = 2;
extensions 100 to 10000;
}
这是主文件,注意看最后一行, 留了100~10000的tag number给其他模块用。注意, 19000 though 19999是protobuf预留的。
接下来,各个模块(角色 任务等) 定义各自的文件。
mod.proto
import "msg.proto";
package ProtoCS;
message ModReq
{
optional bool b = 1;
}
extend Msg
{
optional int32 id = 126;
optional ModReq mod_req = 127;
}
在这个文件里, 该模块把int32 id和ModReq mod_req嵌到主文件的Msg里,这个很关键。
我个人用过几种消息定义方法,这种方法最好,他有下面的好处:
1. 各个模块定义分离, 主文件不会太大, 导致找一个东西很困难的情况出现。
2. 编译上的分离的, 各种模块新增东西不会影响其他模块,而且用法上不会增加复杂度
http://blog.csdn.net/herm_lib/article/details/7392222 像以前这种方法,就比现在复杂,使用上也存在一些麻烦的地方。
使用方法也比较简单
Msg msg;
msg.SetExtension(ProtoCS::id, 7); // 设置上面的id值
ProtoCS::ModReq* modReq = msg.MutableExtension(ProtoCS::mod_req); // 拿到这个modReq, 就可以修改mod_req field的值了。
读取的方法也类似, GetExtension() 之类的。