protobuf Extensions这个东西还真蛮有用的, 这里记录一下用Extensions定义方法。
msg.proto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 像以前这种方法,就比现在复杂,使用上也存在一些麻烦的地方。
使用方法也比较简单
1 2 3 4 5 |
Msg msg; msg.SetExtension(ProtoCS::id, 7); // 设置上面的id值 ProtoCS::ModReq* modReq = msg.MutableExtension(ProtoCS::mod_req); // 拿到这个modReq, 就可以修改mod_req field的值了。 |
读取的方法也类似, GetExtension() 之类的。
发表评论
要发表评论,您必须先登录。