本文环境

  • Protocol Buffer 3
  • Java
  • CentOS 7

介绍

Protocol Buffers 是Google开源的一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化。它很适合做数据存储或RPC数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

Protocol Buffers可以分为两块内容:

  • DSL编写的proto文件,然后使用protoc编译所需要的语言源文件。
  • Protocol Buffers相关语言的依赖库。

实战

下载安装编译器

  1. 打开Protocol Buffers的Github页面,找到Releases标签页或直接点击https://github.com/google/protobuf/releases/tag/v3.1.0,目前最新版为v3.1.0。

  2. 本文基于CentOS和Java,所以点击下载protobuf-java-3.1.0.tar.gz文件并解压。

  3. 先安装C、C++编译器,如果已安装,则跳过该步骤。

    1
    yum install gcc gcc-c++ -y
  4. 切到解压的目录,然后执行

    1
    ./configure && make && make install
  5. 检验是否安装成功

    1
    protoc --version

编写proto文件,文件名为user.proto

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
syntax = "proto3"; //声明使用Protocol Buffer Version 3
//声明Package防止命名冲突
package inaction;
//指定Java的Packge,默认使用packge的值
option java_package = "com.inaction";
//指定Java生成的类名,默认文件名+OuterClass
option java_outer_classname = "UserProto";
message User{
string name = 1; // =1 表示Tag Number 用于序列化,类似UUID
int32 age = 2;
}

编译user.proto

1
2
//<DEST_DIR> 指定编译后的源文件目录
protoc --java_out=<DEST_DIR> user.proto

演示基本的使用方法

  • 新建一个Java项目,将编译器生成的源代码Copy到相应的Package,然后如果使用Maven,则需要在POM里引入

    1
    2
    3
    4
    5
    <dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.1.0</version>
    </dependency>

    如果使用Gradle,则需在build.gradle引入

    1
    compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.1.0'
  • 编写测试类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import com.inaction.UserProto;
    import org.junit.Assert;
    import org.junit.Test;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    /**
    * @author Felix Zhang
    * @datetime 2017-01-02 14:39:18
    */
    public class UserTest {
    @Test
    public void protobufTest() throws IOException {
    UserProto.User user1 = UserProto.User.newBuilder()
    .setName("protobuf")
    .setAge(1).build();
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    //序列化
    user1.writeTo(outputStream);
    //反序列化
    UserProto.User user2 = UserProto.User.parseFrom(outputStream.toByteArray());
    //Assert
    Assert.assertEquals("protobuf", user2.getName());
    Assert.assertEquals(1, user2.getAge());
    }
    }

    具体的API可参考文档https://developers.google.com/protocol-buffers/docs/reference/java/