2021年6月10日 星期四

 Java protobuf


java 用 protobuf


    protobuf 是 google 開發的,基本用於做序列化和反序列化,其資料格式為 byte,不像

    json 或 xml 是文字,故其效能高於 json 或 xml,但可讀性遠低於其他的格式。


環境


    上 github (https://github.com/protocolbuffers/protobuf/releases)

    下載 protobuf 的工具,此處用的是 Protocol Buffers v3.17.2 (下載 protoc-3.17.2-win64.zip)

    

    在 protoc-3.17.2-win64.zip 中,在 bin 這個資料夾裡面有一個 protoc.exe 的檔案。


    開發環境是 intellij idea。


    protobuf 用的 jar 會用 maven 的方式載入。


    .proto 檔的語法參考 https://developers.google.com/protocol-buffers


過程


    建立一個 persion.proto 檔 (看要放在 project 裡或不放都可以)


        protobuf 有分 2 跟 3 兩個不同的版本,兩個版本間支援的語法有些不同,當有使用到

        protobuf 2 的語法時,要指定 syntax = "proto2",當語法全為 protobuf 3 所支援

        的語法時,倒是可以省略掉 syntax 這一行。


        persion.proto


            syntax = "proto2";


            message Person {

                required string name = 1;

                required int32 age = 2;

                optional string address = 3;

                repeated string email = 4;

            }





    在 cmd 中執行


        E:\protoc-3.17.2-win64\bin>protoc.exe --java_out=C:\   test.proto


        然後就會生成一個 Test.java 的檔案在 C:\ 下,在把這個檔案放到 project 裡去


        在 Test.java 中補上 package 的部份


    設定 maven 的 POM 檔,加入 protobuf 的 dependency


        <dependency>

            <groupId>com.google.protobuf</groupId>

            <artifactId>protobuf-java</artifactId>

            <version>2.5.0</version>

        </dependency>


    使用 protobuf


        public static void main( String[] args ) throws IOException {

            // 模擬序列化

            Persion.Person.Builder personBuilder = Persion.Person.newBuilder();

            personBuilder.setName("AAA");

            personBuilder.setAge(12);

            personBuilder.addEmail("email1");

            personBuilder.addEmail("email2");

            Persion.Person p = personBuilder.build();

            // 寫到 stream

            ByteArrayOutputStream output = new ByteArrayOutputStream();

            p.writeTo(output);


            // 模擬反序列化

            byte[] byteAry = output.toByteArray();

            ByteArrayInputStream input = new ByteArrayInputStream(byteAry);

            Persion.Person p2 = Persion.Person.parseFrom(input);

        }









沒有留言:

張貼留言