protobuf用Extensions定义消息方法

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() 之类的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值