概述
- Protocol Buffer (简称Protobuf) 是Google出品的性能优异(类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍))、跨语言、跨平台的序列化库。
- 目前 protocol buffers 最新版本是 proto3,与老的版本 proto2 还是有些区别的。这两个版本的 API 不完全兼容。
- 如果开头第一行不声明 syntax = “proto3”;,则默认使用 proto2 进行解析。
- Protobuf支持很多语言,比如C++、C#、Dart、Go、Java、Python、Rust等,同时也是跨平台的,所以得到了广泛的应用。
涉及名词-序列化
序列化(serialization、marshalling)的过程是指将数据结构或者对象的状态转换成可以存储(比如文件、内存)或者传输的格式(比如网络)。
反向操作就是反序列化(deserialization、unmarshalling)的过程。
历史:
- 1987年曾经的Sun Microsystems发布了XDR。
- 二十世纪九十年代后期,XML开始流行,它是一种人类易读的基于文本的编码方式,易于阅读和理解,但是失去了紧凑的基于字节流的编码的优势。
- JSON是一种更轻量级的基于文本的编码方式,经常用在client/server端的通讯中。
- YAML类似JSON,新的特性更强大,更适合人类阅读,也更紧凑。还有苹果系统的property list。
- 除了上面这些和Protobuf,还有许许多多的序列化格式,比如Thrift、Avro、BSON、CBOR、MessagePack, 还有很多非跨语言的编码格式。
Idea安装protobuf插件(注:以下试验环境均在Mac Idea中实现)
测试数据名为Person 包含 ID、NAME、MAIL 三个属性
在IDEA中安装 protobuf Support 插件(可以是proto文件高亮展示)
IDEA左上角:IntelliJ IDEA -> Preferences… -> Plugins
-> 搜索protobuf Support -> 点击Install
等待安装完成并重启IDEA,
Idea 测试项目Pom文件配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>testCode</groupId>
<artifactId>testCode</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.11.0-rc-2</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.6.2</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocArtifact>
com.google.protobuf:protoc:3.11.0-rc-2:exe:${os.detected.classifier}
</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>
io.grpc:protoc-gen-grpc-java:1.26.0:exe:${os.detected.classifier}
</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
proto文件书写
- 在main目录下,java同级别目录创建proto文件夹
- 创建Person.proto文件,并填写如下内容
syntax = "proto3";
option java_package = "rpc.testPerson";
option java_outer_classname = "PersonModel";
message Person {
int32 id = 1;
string name = 2;
string email = 3;
}
生成相关java文件
- 如图,点击右边Maven中的 comlile
- 左边就会根据编译生成对应名为 PersonModel的java文件
Code Demo
import com.google.protobuf.InvalidProtocolBufferException;
import rpc.testPerson.PersonModel;
/**
* @program: testCode
* @description: test first class
* @author: ipop
* @since: 2020-01-13 16
**/
public class testMain {
public static void main(String[] args) throws InvalidProtocolBufferException {
System.out.println("");
PersonModel.Person.Builder builder = PersonModel.Person.newBuilder();
builder.setId(123);
builder.setName("阿三");
builder.setEmail("@163.com");
PersonModel.Person person = builder.build();
System.out.println("------ create Person ------");
System.out.print(person);
System.out.println("------------------");
System.out.println("===Person Byte===");
for (byte b : person.toByteArray()) {
System.out.print(b);
}
System.out.println("");
System.out.println("================");
System.out.println("");
byte[] byteArray = person.toByteArray();
PersonModel.Person getPerson = PersonModel.Person.parseFrom(byteArray);
System.out.println("Person ID : "+getPerson.getId());
System.out.println("Person Name : "+getPerson.getName());
System.out.println("Person Email : "+getPerson.getEmail());
}
}
评论区