Protocol buffers 是谷歌用于序列化数据的方案,具有语言无关、平台无关、可扩展的机制 – 类似XML, 但更小、更快和更简单。一旦定义了数据的结构化方式,就可以使用特殊生成的源代码轻松地从各种数据流和使用各种语言编写和读取结构化数据。

安装

基于Linux Unbutun平台上源码安装 C++ Installation - Unix

准备

sudo apt-get install autoconf automake libtool curl make g++ unzip

下载源码

git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
./autogen.sh

编译安装

 ./configure
 make
 make check
 sudo make install
 sudo ldconfig # refresh shared library cache.

教程

定义proto消息格式

addressbook.proto

syntax = "proto2";

package tutorial;

// only for Java
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";

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;
}

C++

生成目标代码

protoc -I=code/proto --cpp_out=code/c++ code/proto/addressbook.proto

It will genarate files: addressbook.pb.h and addressbook.pb.cc under code/c++ .

使用

writemsg

readmsg

编译
g++ -std=c++11 code/c++/addressbook.pb.cc code/c++/writemsg.cpp -o code/c++/writemsg.out `pkg-config --cflags --libs protobuf`
g++ -std=c++11 code/c++/addressbook.pb.cc code/c++/readmsg.cpp -o code/c++/readmsg.out `pkg-config --cflags --libs protobuf`
运行
./code/c++/writemsg.out code/c++/my.adr

./code/c++/readmsg.out code/c++/my.adr

Java

生成目标代码

protoc -I=code/proto --java_out=code/java code/proto/addressbook.proto

It will genarate files: AddressBookProtos.java under `code/java .

使用

AddPerson

ListPeople

安装 protobuf Java lib
  1. 进入到 protobuf github源码下的 java 文件夹
  2. 在命令行下输入 mvn clean install -DskipTests 编译并安装protobuf java lib到本地
  3. 从如下地址: /home/<user>/.m2/repository/com/google/protobuf/protobuf-java/3.12.3/protobuf-java-3.12.3.jar 获得库文件
编译
javac -cp "/home/<user>/.m2/repository/com/google/protobuf/protobuf-java/3.12.3/protobuf-java-3.12.3.jar" code/java/com/example/tutorial/*.java
运行
java -cp "code/java:/home/<user>/.m2/repository/com/google/protobuf/protobuf-java/3.12.3/protobuf-java-3.12.3.jar" com.example.tutorial.AddPerson my.adr


java -cp "code/java:/home/<user>/.m2/repository/com/google/protobuf/protobuf-java/3.12.3/protobuf-java-3.12.3.jar" com.example.tutorial.ListPeople my.adr
注意: java 运行命令 的classpath选项中多个路径的分割符在Linux下是 : 而在 Winodws下是 ;

参考

https://github.com/daileyet/protobuf_guide