ProtoBuf简单介绍及简单实用-Java

概述

  • 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文件书写

  1. 在main目录下,java同级别目录创建proto文件夹
  2. 创建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文件

-w1283
  1. 如图,点击右边Maven中的 comlile
  2. 左边就会根据编译生成对应名为 PersonModel的java文件

简单测试类

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());

    }
}
小捐怡情,大捐感激,点下广告也是极好的