美文网首页
Protocol Buffer简介

Protocol Buffer简介

作者: 铜锣饼 | 来源:发表于2021-02-21 15:56 被阅读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

相关文章

网友评论

      本文标题:Protocol Buffer简介

      本文链接:https://www.haomeiwen.com/subject/ufdxfltx.html