天天看点

C++ 关于 protobuf的一些操作

先是定义部分,下面跟一些例子组成:

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
	*/
           

继续阅读