Proto3原文链接
1.指定proto版本,默认是2 eg:syntax = “proto3”;必须在文件的首行
2.指定包 package 类似于C++的命名空间
3.定义message
4.具体参见上文博客
Note:前后协议兼容扩展的时候,每个字段一定要保证tag是一致的,并且不能复用,否则可能出现数据错乱问题。协议tag保证一致,对定义顺序可以不保持一致:因为在序列化和反序列化的时候是根据tag来打包的。和定义顺序无关。
5.demo
syntax = "proto3";
message Book
{
string name = 1;
int32 pages = 2;
float price = 3;
repeated string info=5;
}
message Student
{
int32 age = 1;
string name = 2;
float score = 3;
Book arrBook = 4;
}
message BookEx
{
reserved 1;
reserved "name";
repeated string info=5;
float price = 3;
int32 pages = 2;
string date = 4;
map<int32,int32> map_int= 6;
}
enum OP_TION
{
op_1 = 0;
op_2 = 2;
}
其中为了测试方便,认为BookEx是Book的扩展协议。
#include "stdafx.h"
#include <iostream>
#include "addr.pb.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
Book bookw,bookr;
BookEx bookrex;
bookw.set_name("protobuf");
bookw.set_pages(20);
bookw.set_price(9.99);
bookw.add_info("this is a test");
std::string str = bookw.SerializeAsString();
//cout << str.size() << endl;
int nSize = bookw.ByteSizeLong();
//cout << nSize << endl;
cout << "book info:";
bookr.ParseFromString(str);
cout << "name:"<<bookr.name() << " " << "pages:" << bookr.pages() << " " << "price:" << bookr.price() << endl;
cout << "bookEx info:";
bookrex.ParseFromString(str);
cout << "date:"<<bookrex.date() << " " <<"pages:"<< bookrex.pages() << " " <<"price:"<< bookrex.price() << " ";
for (int i = 0; i < bookrex.info_size();++i)
{
cout <<"info:"<< bookrex.info(i) << endl;
}
return 0;
}
运行结果:解包和tag有关,和定义顺序无关