Protocol Buffer简介
2021-02-21 本文已影响0人
铜锣饼
Protocol Buffer,简称ProtoBuf,是由Google提出的一个序列化数据结构协议,相比于传统的字符串、XML等格式化方式,具有数据利用效率高、灵活性扩展性好、开发便捷等特点,可以应用于服务于服务之间的数据交互、软件与硬件之间的数据交互等。
目前官方支持的语言包括C++ ,C# ,Dart ,Go ,Java ,Python
入门使用方法
以C++为例,首先到下载页面下载protobuf执行文件和对应语言源码包
下载bin文件包并解压缩protoc-3.15.1-win64.zip
下载C++源码包protobuf-cpp-3.15.1.zip
下载后解压缩
其中protoc-3.15.1-win64/bin路径下是可执行文件protoc.exe,为了操作系统中调用方便,建议增加到系统Path路径中
image.png
Protocol Buffer的源代码是以.proto结尾的文件,在protobuf-cpp-3.15.1\protobuf-3.15.1\examples中,有一个官方例程对应的Protobuf文件源码,addressbook.proto,其核心内容如下
message Person {
string name = 1;
int32 id = 2; // Unique ID number for this person.
string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
repeated PhoneNumber phones = 4;
google.protobuf.Timestamp last_updated = 5;
比较直观,就是定义了一个通讯录的信息结构,包含人名、ID、Email、最多4个号码信息,最近一次更新时间。其中号码信息中包含了:号码值和号码类型
进入到这个路径,打开Powershell,运行命令
protoc --cpp_out=. .\addressbook.proto
然后在同目录会出现两个生成的文件addressbook.pb.h和addressbook.pb.cc
.h文件中提供了很多操作数据内容的接口函数,例如对于人名提供了
// string name = 1;
void clear_name();
const std::string& name() const;
void set_name(const std::string& value);
void set_name(std::string&& value);
void set_name(const char* value);
void set_name(const char* value, size_t size);
std::string* mutable_name();
std::string* release_name();
void set_allocated_name(std::string* name);
还包含了一些通用的操作函数,例如
bool IsInitialized() const final; //用于检查是否所有必须的字段都已经填写
PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; //清空所有字段
最后调用Protocol Buffer的类方法进行序列化和解序列化处理
bool SerializeToString(string* output) const; //序列化成一个字符串形式。注意这个并非真正可读的字符串,只是利用字符串作为容器装载了序列化后的二进制信息。
bool ParseFromString(const string& data); //从一个序列化后的字符串中解析出protobuf的信息
如果是其他语言,类似的,例如Python语言则运行
protoc --python_out=. .\addressbook.proto