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. Storm 实时读取本地文件操作(模拟分析网络日志)

    WebLogProduct 产生日志类 package top.wintp.weblog; import java.io.FileNotFoundException; import java.io.F ...

  2. K-Means(K均值)、GMM(高斯混合模型),通俗易懂,先收藏了!

    1. 聚类算法都是无监督学习吗? 什么是聚类算法?聚类是一种机器学习技术,它涉及到数据点的分组.给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组.理论上,同一组中的数据点应该具有相似 ...

  3. JAVA面试题 String s = new String("xyz");产生了几个对象?

    面试官Q1:请问String s = new String("xyz");产生了几个对象? 对于这个Java面试题,老套路先上代码: public class StringTest ...

  4. 云计算:Linux运维核心管理命令详解

    云计算:Linux运维核心管理命令详解 想做好运维工作,人先要学会勤快: 居安而思危,勤记而补拙,方可不断提高: 别人资料不论你用着再如何爽那也是别人的: 自己总结东西是你自身特有的一种思想与理念的展 ...

  5. C++ 八数码问题宽搜

    C++ 八数码问题宽搜 题目描述 样例输入 (none) 样例输出 H--F--A AC代码 #include <iostream> #include <stdio.h> #i ...

  6. python基础——元组(tuple)

    Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. tuple1 = () tuple2 = ...

  7. 前端js性能优化的要点

    1 尽量少使用全局查找,比如全局变量,如果要多次使用,可以将全局变量存为局部变量再使用 eg:function(){ var body=document.body; alert(body): body ...

  8. DES、3DES、AES、PBE对称加密算法实现及应用

    1.对称加密算法概述 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若想解读原文 ...

  9. Android 9.0 关机流程分析

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  10. vue+Elment-UI,修改element组件样式

    在用vue开发项目过程中,我们总是避免不了的会使用到elementUI,它里面提供的一些组件都为我们的开发带来了很大的便利,但是,当有时候我们需要使用这些组件的同时又要修改下组件的UI样式的话,我们该 ...