菜鸟笔记
提升您的技术认知

protobuf repeated的用法

//User.proto
package ProtoMessage;

message User
{
    required uint32 ID = 1;
    required string name = 2;
}

message UserList
{
    repeated User user = 1;
}

message RoomList
{
    repeated string name = 1;
}

编译成User.pb.h和User.pb.cpp文件

cd protoc.exe所在的目录

protoc -I=. –cpp_out=. User.proto

配置VS2013环境变量

1、头文件目录

2、库目录

3、库文件名

测试:

// Messages.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include "messages.pb.h"
#include "User.pb.h"
//using namespace messagesuites;

int _tmain(int argc, _TCHAR* argv[])
{
	messagesuites::RoomChatRequest request;
	request.set_room("GuangZhou");
	request.set_msg("Hello World!");

	ProtoMessage::UserList listUser;
	ProtoMessage::User* pUser;

	pUser = listUser.add_user();
	pUser->set_id(10001);
	pUser->set_name("Zhang Wuji");
	pUser = listUser.add_user();
	pUser->set_id(10002);
	pUser->set_name("Zhou Zhiruo");
	pUser = listUser.add_user();
	pUser->set_id(10003);
	pUser->set_name("Zhao Ming");

	std::cout << listUser.user(0).id() << ": " << listUser.user(0).name() << std::endl;
	std::cout << listUser.user(1).id() << ": " << listUser.user(1).name() << std::endl;
	std::cout << listUser.user(2).id() << ": " << listUser.user(2).name() << std::endl;

	char szBuffer[1024];
	listUser.SerializeToArray(szBuffer, sizeof(szBuffer));
	ProtoMessage::UserList listUser2;
	listUser2.ParseFromArray(szBuffer, strlen(szBuffer) + 1);

	std::cout << std::endl;
	std::cout << listUser2.user(0).id() << ": " << listUser.user(0).name() << std::endl;
	std::cout << listUser2.user(1).id() << ": " << listUser.user(1).name() << std::endl;
	std::cout << listUser2.user(2).id() << ": " << listUser.user(2).name() << std::endl;

	ProtoMessage::RoomList listRoom;
	listRoom.add_name("GuangDong");
	listRoom.add_name("ShenZhen");
	listRoom.add_name("DongGuang");

	memset(szBuffer, 0, sizeof(szBuffer));
	listRoom.SerializeToArray(szBuffer, sizeof(szBuffer));
	ProtoMessage::RoomList listRoom2;
	listRoom2.ParseFromArray(szBuffer, strlen(szBuffer) + 1);

	std::cout << std::endl;
	std::cout << listRoom2.name(0) << " " << listRoom2.name(1) << " " << listRoom2.name(2) << std::endl;

	getchar();
	return 0;
}