proto文件简介

每个元素上的“= 1”,“= 2”标记标识该字段在二进制编码中使用的唯一“标记”

每个字段有三个可选修饰符

  • required:必须提供字段的值,否则消息将被视为“未初始化”。
  • optional:字段可以设置也可以不设置。如果未设置可选字段值,则使用默认值。对于简单类型,您可以指定自己的默认值,就像我们对示例中的电话号码类型所做的那样。否则,将使用系统缺省值:数字类型为零,字符串为空字符串,bools为false。
  • repeated:相当于std的vector,可以用来存放N个相同类型的内容
package tutorial;

message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3; enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
} message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
} repeated PhoneNumber phones = 4;
} message AddressBook {
repeated Person people = 1;
}

Compiling Your Protocol Buffers

下载编译器

注意:

1.proto文件路径要有文件名,而–cpp_out路径不能有文件名,只能是路径

protoc xxxx.proto --cpp_out=.

2.最好是cd到proto文件所在的目录再导出,否则会出现生成出来的文件找不到头文件的问题

protobuf生成C++代码时会在同一个目录下生成两个文件,一个.cc一个.h,生成的.cpp文件会include生成的.h文件,而如果不cd到proto文件所在目录去操作,那就可能会出现.cc文件包含.h文件时路径错误

例如:.proto文件在src目录下,导出代码也导出到src目录下,可能执行如下命令

protoc src/xxxx.proto --cpp_out=.

因为你想要C ++类,所以使用–cpp_out选项 - 为其他支持的语言提供类似的选项。

=>得到 pb.h 和pb.cc文件

1.在.h文件中,可以看到

getter的名称是小写的字段,setter方法以set_开头。每个单数(必需或可选)字段还有has_方法,如果该字段已设置,则返回true。最后,每个字段都有一个clear_方法,将字段取消设置为其空状态。

2.字符串字段

调用mutable_email();它将被自动初始化为一个空字符串。inline ::std::string* mutable_email();

3.repeated字段

  • 检查重复元素的_size
  • 获取index指定位置的元素
  • 更新索引的元素
  • 向消息中添加另一个元素,然后可以对其进行编辑(重复的标量类型具有add_,只是允许您传递新值)。

4.一些有用的函数

  • bool IsInitialized()const ;:检查是否所有必填字段都已设置。
  • string DebugString()const ;:返回一个人类可读的消息表示,特o别适用于调试。
  • void CopyFrom(const Person&from);:用给定消息的值覆盖消息。
  • void Clear();:将所有元素清除回空状态。

重头戏:Parsing and Serialization

bool SerializeToString(string * output)const ;:序列化消息并将字节存储在给定的字符串中。 注意字节是二进制的,而不是文本; 我们只用String类作为一种方便的容器。

bool ParseFromString(const string&data);:解析来自给定字符串的消息。

bool SerializeToOstream(ostream * output)const ;:将消息写入给定的C ++ ostream。

bool ParseFromIstream(istream * input);:解析来自给定C ++ istream的消息。

这些只是为解析和序列化提供的几个选项。 再次,有关完整列表,请参阅Message API参考。

//C++string序列化和序列化API
bool SerializeToString(string* output) const;
bool ParseFromString(const string& data);
//使用:
void set_people()
{
wp.set_name("sealyao");
wp.set_id(123456);
wp.set_email("sealyaog@gmail.com");
wp.SerializeToString(&pstring);
} void get_people()
{
rsp.ParseFromString(pstring);
cout << "Get People from String:" << endl;
cout << "\t Name : " <<rsp.name() << endl;
cout << "\t Id : " << rsp.id() << endl;
cout << "\t email : " << rsp.email() << endl;
}

Google Protocol Buffer Basics: C++的更多相关文章

  1. Protocol Buffer Basics: Python

    原文https://developers.google.com/protocol-buffers/docs/pythontutorial Protocol Buffer Basics: Python ...

  2. Google Protocol Buffer 的使用和原理[转]

    本文转自: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构 ...

  3. Google Protocol Buffer 的使用

    简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...

  4. 学习Google Protocol buffer之概述

    XML这种属于非常强大的一种格式,能存储任何你想存的数据,而且编辑起来还是比较方便的.致命的缺陷在于比较庞大,在某些情况下,序列化和解析都会成为瓶颈.这种对于实时性很强的应用来说,就不太适合了,想象下 ...

  5. Google Protocol Buffer的安装与.proto文件的定义

    什么是protocol Buffer呢? Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准. 我理解的就是:它是一种轻便高效的结构 ...

  6. Google Protocol Buffer 的使用和原理

    Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...

  7. Google Protocol Buffer 的编码方式

    Google Protocol Buffer 使用到了两种编码方式:Varints 和 zigzag. 一 Varints 编码 每个 byte 只用 7bit 表示数字,最高位 bit作为标志位,如 ...

  8. Google Protocol Buffer 协议

    1. Protocol Buffers 简介 Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化 ...

  9. Google Protocol Buffer

    Google Protocol Buffer(protobuf)是一种高效且格式可扩展的编码结构化数据的方法.和JSON不同,protobuf支持混合二进制数据,它还有先进的和可扩展的模式支持.pro ...

随机推荐

  1. Node.js socket 双向通信

    使用场景:  聊天室:大量数据常驻交互: 技术栈: Node.js,     Vue.js || 原生JS 服务端代码: const app = require('http').createServe ...

  2. KafKa 发消息到Storm

    通过kafka客户端发送数据,由KafkaSpout进行接收消息,传输到ConsumerBolt进行实时数据处理. maven依赖 <dependencies> <!-- https ...

  3. C#3.0新增功能07 查询表达式

    连载目录    [已更新最新开发文章,点击查看详细] 查询是什么及其作用是什么 查询是一组指令,描述要从给定数据源(或源)检索的数据以及返回的数据应具有的形状和组织. 查询与它生成的结果不同. 通常情 ...

  4. [PTA] 数据结构与算法题目集 6-12 二叉搜索树的操作集

    唯一比较需要思考的删除操作: 被删除节点有三种情况: 1.叶节点,直接删除 2.只有一个子节点,将子节点替换为该节点,删除该节点. 3.有两个子节点,从右分支中找到最小节点,将其值赋给被删除节点的位置 ...

  5. bugku安卓First_Mobile wp

    1 打开题目,下载apk 2 将下载好的apk拖进android killer中,提示文件名过长,随便更改一下文件名即可 3 查看入口文件源码(点击android killer工具栏咖啡杯图标) 4  ...

  6. cocos creator 小游戏区域截图功能实现

    截图是游戏中非常常见的一个功能,在cocos中可以通过摄像机和 RenderTexture 可以快速实现一个截图功能,具体API可参考:https://docs.cocos.com/creator/m ...

  7. 《VR入门系列教程》之1---预热篇

     序     初识虚拟现实技术,非常倾心,奋力习之,阅<Learning Virtual Reality>一书之后觉得甚好,但不愿独乐乐,于是翻译之,与大家共同学习.本人学艺不精,难免有翻 ...

  8. 基于SDN网络的负载均衡研究与实现

    为什么需要软件定义网络 1.网络缺乏可扩展性,创新正在停滞不前.   我们最新的研究发现,几乎每两个组织中就有一个认为需要将网络功能扩展为采用SDN的主要业务触发因素,而不是其他催化剂.这一统计数据一 ...

  9. 完美解决eclipse编辑器中文字符过小问题

    window – preferences – general – appearance – colors and fonts – basic – text font – edit 把弹出页面中“西欧语 ...

  10. 第二章 :初识MySQL

    一.MySQL 1. MySQL的版本 社区版 企业帮 2.MySQL的优势 1.运行速度快 2.使用成本低 3.容易使用 4.可移植性高 5.适用更多用户 二.默认字符集设置 1.Standard ...