proto3 语法+使用

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有关,和定义顺序无关
这里写图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值