先是定义部分,下面跟一些例子组成:
message DBRoleData {
uint64 RoleID = 2;
string Name = 6;
repeated int64 Action= 12;//存内置重复单位
}
message DBRoleLoginAck {
DBRoleData RoleData = 3;
}
//1 一个例子
//函数里面(DBRoleLoginAck& Ack)
{
// 创建一个该对象,存入数据
DBRoleData* pData = Ack.mutable_roledata();//这个是方法
pData->set_roleid(INT64 ) ;//设置值
pData->set_name(const char*);
pData->add_action( INT64 );
pData->add_action( INT64 );
}
//2个例子 :存自定义重复单位
message RoleItem {
uint64 RoleID = 1;
}
message RoleListAck {
repeated RoleItem RoleList = 3;
}
函数//(RoleListAck& Ack)
RoleItem* pNode = Ack.add_rolelist();
pNode->set_roleid(INT64) //设置数据
//3.例子 单个对象 复合对象
(DBRoleLoginAck& Ack)
message DBCopyItem {
uint64 RoleID = 1; //角色ID
}
message DBCopyData {
repeated DBCopyItem CopyList = 1; //重复对象
}
message DBRoleLoginAck {
DBCopyData CopyData = 5;//只有一个
}
DBCopyData* pData = NULL;
pData = Ack.mutable_copydata();//取该对象
DBCopyItem* pItem = pData->add_copylist(); //创建重复对象
pItem->set_roleid(INT64) //设置
//4.遍历对象
message ActionReqItem {
uint64 ObjectGuid = 1;
}
message ObjectActionReq {
repeated ActionReqItem ActionList = 1; //自定义 重复对象
}
ObjectActionReq Req; //解析结构体
Req.ParsePartialFromArray(pNetPacket->m_pDataBuffer->GetData(), pNetPacket->m_pDataBuffer->GetBodyLenth());
for(int i = 0; i < Req.actionlist_size(); i++) //遍历 重复对象
{
const ActionReqItem& Item = Req.actionlist(i); //获取该重复对象返回类型为const ::ActionReqItem&
UINT64 uID = Item.objectguid() //
}
//5.实例读取对象 主要是一些常见操作
message PhoneNumber {
PhoneType type = 2 ;
}
message Person {
string name = 1;
int32 id = 2;
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
//以下写测试代码
AddressBook addBook;
//加入第一个人
Person* people1 = addBook.add_people(); //增加
people1->set_name("xiao");
people1->set_id(100);
//设置第一个人的电话号码
PhoneNumber* phone1 = people1->add_phones();
phone1->set_type(MOBILE);//0
//加入第二个人
Person* people2 = addBook.add_people(); //增加
people2->set_name("long");
people2->set_id(99);
//设置第二个人的第一个电话号码
PhoneNumber* phone2 = people2->add_phones();
phone2->set_type(WORK);//2
//设置第二个人的第二个电话号码
PhoneNumber* phone3 = people2->add_phones();
phone3->set_type(HOME);//1
//加入第三个人
Person* people3 = addBook.add_people(); //增加
people3->CopyFrom(*people2);
//设置第三个人的第三个电话号码
PhoneNumber* phone4 = people3->add_phones();
phone4->CopyFrom(people3->phones(1)); //拷贝一份自己的第一个电话号码
PhoneNumber phone5;
phone5.CopyFrom(*phone2);//传入const PhoneNumber& from 返回 PhoneNumber 对象
CLog::GetInstancePtr()->LogError("phone5 type = %d", phone5.type()); //-- 2
CLog::GetInstancePtr()->LogError("gg addBook.people_size() = %d", addBook.people_size()); //-- 3
for (int i =0;i< addBook.people_size();i++)
{
const Person& per = addBook.people(i);
int id = per.id();
for (int j =0;j< per.phones_size();j++)
{
int type = per.phones(j).type();
CLog::GetInstancePtr()->LogError("people i= %d = phone4 =%d id =%d type =%d ", i,j, id, type);
}
}
/* 以下输出为
people i = 0 = phone4 = 0 id = 100 type = 0
people i = 1 = phone4 = 0 id = 99 type = 2
people i = 1 = phone4 = 1 id = 99 type = 1
people i = 2 = phone4 = 0 id = 99 type = 2
people i = 2 = phone4 = 1 id = 99 type = 1
people i = 2 = phone4 = 2 id = 99 type = 1
*/