protobuf简单入门(windows+java)

本文内容:

  1. protobuf介绍
  2. protobuf简单示例(真的不用像网上说的那样,各种编译安装的)

    protobuf介绍

Protobuf协议,全称:Protocol Buffer ,是Google开发的一种数据描述语言,能够将结构化数据序列化,可用于数据存储、通信协议等方面。

官方网站:https://github.com/google/protobuf

现在大部分系统的数据交互格式是json,较老的可能使用的是xml,他们都是文本格式的,对于某些系统,要求更快的生成速度,更小的占用空间,就需要使用protobuf了。
我们完全可以把它理解为更快、更简单、更小的JSON或者XML,它是二进制的,突出优点:1.序列化、反序列化速度快;2.占用空间小。
但是,我认为可能它的普及程度应该不及json,原因:1.相对来说,使用起来比较麻烦;2.二进制的,不像json,xml能直观的看懂消息含义。
我了解到这个技术,还是以前一位同事,新公司做的软硬件结合,需要自己定义一种协议来通信,正好protobuf很符合他们的技术选型要求。
同类框架:facebook thrift/微软 bond

protobuf简单示例

本示例是在windows操作系统上,使用java语言,来完成的一个入门小demo。具体步骤:

  1. 下载windows环境下的生成工具,protoc-3.3.0-win32.zip,地址:https://github.com/google/protobuf/releases/tag/v3.3.0 (我这提供的是最新版3.3.0的网址)
  2. 解压,bin目录下获得protoc.exe。(仅仅使用该exe工具,就可以完成proto文件转java文件【及其他语言格式】,不需要网上所说的各种编译安装)(说要必须配置环境变量path的,就更不要提了,请搞清楚path设置的意义)
  3. 编写proto文件——person.proto,我这就写个小demo,具体各种字段类型,枚举之类的,等要深入使用,再查阅文档即可。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    syntax = "proto3";//定义使用的版本,这里是proto3
    package kevinlsui; //
    option java_package = "com.kevinlsui.protobuf"; // 包结构
    option java_outer_classname = "MyFirstProtobuf"; // 生成的java类的名字
    //定义一个消息
    message Person
    {
    //proto3,给字段加required 、optional ,转换时提示错误,删掉就好了,后续用时具体研究原因
    string name =1; // 定义个name,字段类型是string(等号后面的1,是该字段的标志,一般1-15,具体后续研究)
    int32 age = 2; // 定义年龄age,字段类型是int
    }

4.win——cmd,切换到exe的目录(如果你配置了path,就不用切换到该目录了),执行proto文件转java文件

1
2
3
protoc -I=F:\protobuf\protoc-3.3.0-win32\bin --java_out=F:\protobuf\protoc-3.3.0-win32\bin F:\protobuf\protoc-3.3.0-win32\bin\person.proto
// 具体参数含义,google/baidu
// 注意修改对应目录

5.在对应包目录(com.kevinlsui.protobuf)下,找到 MyFirstProtobuf.java。
6.IDE里面新建java工程,引入jar包:protobuf-java-3.3.0.jar。(可maven仓库下载,或直接pom配置)
7.建立测试类,具体代码如下。

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
33
34
35
36
37
38
39
40
41
42
43
package com.kevinlsui.protobuf.test;
import com.google.protobuf.InvalidProtocolBufferException;
import com.kevinlsui.protobuf.MyFirstProtobuf;
/**
* protobuf测试类
*/
public class ProtobufTest {
public static void main(String[] args) {
//序列化,转换为流
MyFirstProtobuf.Person.Builder builder = MyFirstProtobuf.Person.newBuilder();
builder.setName("kevinlsui");
builder.setAge(25);
MyFirstProtobuf.Person person = builder.build();
System.out.println(person.getName());
System.out.println(person.getAge());
byte[] bytes = person.toByteArray();
System.out.println(bytes);
System.out.println("================================");
//反序列化,转为对象
try {
MyFirstProtobuf.Person person1 = MyFirstProtobuf.Person.parseFrom(bytes);
System.out.println(person1.getName());
System.out.println(person1.getAge());
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
}
}
// console显示:
// kevinlsui
// 25
// [B@49d67b41
// ================================
// kevinlsui
// 25
文章目录
  1. 1. protobuf介绍
  2. 2. protobuf简单示例
|