浅尝GoogleProtocolBuffer

1.测试编译的环境为vs2010  win7 64位
2.下载protobuf-2.5.0 由于是以前下载的不知道是否有新版本
3.解压后使用vs2010编译protobuf-2.5.0 中 vsprojects中项目(这里根据需要生成lib--libprotobuf.lib,libprotoc.lib)
4.新建测试项目GoogleProtocolBuffer
5.将vsprojects中include拷贝到新建项目中,并新建lib文件夹存放编译好的libprotobuf.lib,libprotoc.lib
 
 
6.在项目属性中设置C/C++ --> 常规 --> 附加包含目录(填写include的位置)
                  链接器--> 常规 --> 附加库目录(填写lib的位置)
                  链接器--> 输入 --> 附加依赖项(添加libprotobuf.lib,libprotoc.lib)
7.根据注进行生成rolemessage.pb.cc与rolemessage.pb.h文件并包含到项目与引用在项目中即可使用
 
编译运行即可
 
注:可使用protobuf-2.5.0 中 vsprojects编译出的proto.exe文件进行生成消息文件
proto.exe同目录新建SRC 和 DST 文件夹
cmd到位置然后使用 protoc.exe --proto_path=SRC --cpp_out=DST SRC/rolemessage.proto  
http://www.cnblogs.com/royenhome/archive/2010/10/29/1864860.html 参照编写proto 与生成对应文件
 
required 关键字时 若需要序列化必须填值,否则将序列化报错

1)对于required的字段而言,初值是必须要提供的,否则字段的便是未初始化的。在Debug模式的buffer库下编译的话,序列化话的时候可能会失败,而且在反序列化的时候对于该字段的解析会总是失败的。所以,对于修饰符为required的字段,请在序列化的时候务必给予初始化。

2)对于optional的字段而言,如果未进行初始化,那么一个默认值将赋予该字段,当然也可以指定默认值,如上述proto定义中的PhoneType字段类型。

3)对于repeated的字段而言,该字段可以重复多个,google提供的这个addressbook例子便有个很好的该修饰符的应用场景,即每个人可能有多个电话号码。在高级语言里面,我们可以通过数组来实现,而在proto定义文件中可以使用repeated来修饰,从而达到相同目的。当然,出现0次也是包含在内的。       其中字段标签标示了字段在二进制流中存放的位置,这个是必须的,而且序列化与反序列化的时候相同的字段的Tag值必须对应,否则反序列化会出现意想不到的问题。

rolemessage.proto 如下
message RoleMessage {
required string sMacAsClientID = 1;//客户端唯一标示
required string sRoleFileName = 2;//人物模型文件名
required string sRoleName = 3;//人物名称
required string sHeadName = 4;
required int32 nFieldID = 5;//当前地图ID
required int32 nLastFieldID = 6;//上次移动前地图ID
required float nX = 7;//当前X
required float nY = 8;//当前Y

required int32 nLevel = 9;
required int32 nPVPLevel = 10;
required int32 nPetID = 11;

enum FieldType
{
FIELD_HORIZONTAL = 0;
FIELD_VERTICAL = 1;
}
required FieldType fieldType = 12;//地图类型(横or纵)
required int32 nRoomID = 13;//登陆的频道号码
 }
posted @ 2014-03-12 21:55  xiaoEight  阅读(231)  评论(0编辑  收藏  举报