google protocl buffer 序列化和反序列化的一个例子(一)

2014-11-23 23:11:52 · 作者: · 浏览: 10
google protocl buffer 序列化和反序列化的一个例子
需要先定义协议文件 relation.proto,文件内容如下:
package mooon.rpc;
option cc_generic_services = true;
message ReqUserInfo
{
required uint32 userid = 1;
required string mask = 2;
}
message UserLanguage
{
required uint32 userid = 1;
optional string languageid = 2;
optional string createdate = 3;
optional string languagename = 4;
optional string languagefirstletter = 5;
optional string orderby = 6;
}
message UserLanguages
{
repeated UserLanguage userlanague = 1;
}
message RespUserInfo
{
required uint32 result = 1;
optional string msg = 2;
repeated UserLanguages userlanguage = 3;
}
service GetUserInfo
{
rpc userinfo (ReqUserInfo) returns (RespUserInfo);
}
/*
使用 google protocol buffer 提供的工具
protoc relation.proto --cpp_out .
构造
relation.pb.h 和 relation.pb.cc
*/
下面是pb_strem.cpp的主要实现,演示了序列化和反序列化的过程
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "relation.pb.h"
using namespace std;
using namespace example;
using namespace example::rpc;
using namespace::google::protobuf::io;
/*
使用 google protocol buffer 提供的工具
protoc relation.proto --cpp_out .
构造
relation.pb.h 和 relation.pb.cc
*/
const std::string decode()
{
::example::rpc::RespUserInfo* response = new ::example::rpc::RespUserInfo();
::example::rpc::UserLanguages *Languages = response->add_userlanguage();
const int count = 3;
//模拟构造多个对象
for(int i = 0;i < count;++i)
{
::example::rpc::UserLanguage *Language = Languages->add_userlanague();
Language->set_userid(i);
std::stringstream index;
index<
Language->set_languageid("ID_" + index.str());
Language->set_createdate("date");
Language->set_languagename("name" + index.str());
Language->set_languagefirstletter("A");
Language->set_orderby(index.str());
std::stringstream s;
s<<"userid:"<userid()<<" name:"<languagename();
std::cout<
}
std::string serialize = "";
if(!Languages->SerializePartialToString(&serialize))
{
serialize = "";
std::cout<<"SerializePartialToString fail"<
}
delete response;
response = NULL;
return serialize;
}
void encode(const std::string &value)
{
::example::rpc::RespUserInfo* response = new ::example::rpc::RespUserInfo();
::example::rpc::UserLanguages *Languages = response->add_userlanguage();
::google::protobuf::io::CodedInputStream input((::google::protobuf::uint8*)value.c_str(),value.size());
if(Languages->MergePartialFromCodedStream(&input))
{
for(int i = 0;i < Languages->userlanague_size();++i)
{
const UserLanguage language = Languages->userlanague(i);
std::stringstream s;
s<<"userid:"<
std::cout<
}
}
else
{
std::cout<<"MergePartialFromCodedStream fail"<
}
std::cout<<"***************************"<
::example::rpc::UserLanguages languages = response->userlanguage(0);
for(int i = 0;i < languages.userlanague_size();++i)
{
const UserLanguage language = languages.userlanague(i);
std::stringstream s;
s<<"userid:"<
std::cout<
}
delete response;
response = NULL;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::s