Google Protobuf源码剖析(一)
Nov 7, 2016
本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议.
很久之前写过一篇Google protobuf(C++) 学习笔记.
google protobuf被大量用于公司的RPC通信中作为序列化和序列化工具, 高于JSON和XML的性能值得拥有. 刚好最近有时间, 准备强读一发google protobuf源码
前提
本文所有所有示例均基于官方示例addressbook.proto:
|
|
required字段初值是必须要提供的, 否则字段的便是未初始化的, 序列化的时候必须对required初始化optional字段如果未进行初始化,那么一个默认值将赋予该字段repeated字段可以理解为数组,
每个变量后的数字为标签, 用于标示了字段在二进制流中存放的位置
运行protoc -I=./ --cpp_out=./ ./addressbook.proto通过protoc来生成 .h和.cpp文件.
那么.h文件中到底生成了什么呢?
|
|
Protobuf主要类
Message类, 是一个抽象层, 记录了一个proto文件里的所有内容.Message继承自MessageLiteMessageLite类, 是一个轻量级的接口协议, 这个接口由所有协议的消息对象来实现, 这个类中包含大量定义的虚函数和纯虚函数. 使用MessageLite来生成代码, 需要在.proto中加入下面这行
|
|
Arena类主要用于协议消息的内存分配和释放, 并且分配内存是线程安全的.
|
|
Reflection类, 是一个用于动态访问和修改协议消息各种变量域的类(也就是我们常说的反射机制), 该类只在Message中实现(MessageLite中没有)Descriptor类, 用于描述协议消息,通过Message::GetDescriptor()来获取Message对应的
待续…