protobuf原理以及在 Idea 中 Java 的用法示例

ProtoBuf 原理參考 https://www.jianshu.com/p/419efe983cb2

搭建 IDEA 環境,將proto文件自動編譯成 Java 文件.

新建Maven 工程,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>com.ljy</groupId>
    <artifactId>ProtoBuf</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.4.0</version>
        </dependency>
    </dependencies>
    <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId><!--引入操作系統os設置的屬性插件,否則${os.detected.classifier} 操作系統版本會找不到 -->
                <version>1.5.0.Final</version>
            </extension>
        </extensions>
        <plugins>
            <!--添加編譯proto文件的編譯程序和對應的編譯插件-->
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.5.1</version>
                <configuration>
                    <protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
                    <protocArtifact>com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.14.0:exe:${os.detected.classifier}</pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

點擊 idea 中的maven進行編譯,將proto編譯成 JAVA 文件.

在這裏插入圖片描述
編譯過程由於要下載插件,可能會很慢,請耐心等待…
編譯後的 java 文件:
在這裏插入圖片描述
該文件有 proto 插件自動生成,代碼有大概近兩千行.詳情就不貼代碼了.

編寫測試類:

package com.ljy;

import com.google.protobuf.InvalidProtocolBufferException;
import com.ljy.proto.Beans;

public class ProtoTest {
    public static void main(String[] args) {
        final Beans.Person person = Beans.Person.newBuilder()
                .setName("張三")
                .setAge(16)
                .setAdult(false)
                .addHobbies("籃球")
                .addHobbies("乒乒球")
                .addHobbies("羽毛球")
                .setTimeStamp(20190618L)
                .build();
        System.out.println(person);


        Beans.Order order = Beans.Order.newBuilder()
                .setOrderId("000000001")
                .setOrderName("羽毛球拍")
                .setPrice(1800.0)
                .setOrderTime(1)
                .build();
        final byte[] bytes = order.toByteArray();
        System.out.println(bytes.length);
        try {
            final Beans.Order order2 = Beans.Order.parseFrom(bytes);
            System.out.println(order2.getOrderName());
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
    }
}

運行結果:
在這裏插入圖片描述

最後,protobuf 對於序列化還是挺方便的,HBase 中RPC 通訊大量採用的protobuf,所以還是很有必要了解一下.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章