windows環境下protobuf的java操作{編譯,序列化,反序列化}


google protocol buffer的使用和原理

  • 概況:
    • Protocol Buffers(也就是protobuf)是谷歌的語言中立的、平台中立的、可擴展的用於序列化結構化的數據;
  • windows環境下的安裝與使用:
    • protocol編譯器
      1. 安裝。安裝protocol編譯器,用來編譯.proto文件;
        1. 下載。路徑:https://github.com/google/protobuf/releases。里面有windows版的:protoc-3.6.1.win32.zip。
        2. 安裝。
          • 下載完解壓后,如果不想安裝,可直接在cmd窗口進入解壓得到的bin目錄操作。
          • 安裝,把bin目錄copy下來,放到操作系統環境變量的path變量后面。
      2. 使用
        1. 自己編寫proto文件。例如我這里寫的文件:
          message demo{
              required int32 id = 1;
              required string name = 2;
              optional string email = 3;
              repeated string friends = 4;
              
          }
          View Code

           

        2. 編譯:
          • 編譯結果挺惡心的,一個只有幾行代碼的文件,編譯結果動不動就是幾千行幾萬行。。。
          • 編譯命令示例:protoc --protopath D:\lshdownload\protoc-3.6.1-win32\bin --java_out ./ protoDemo.proto
            • protoc,編譯命令;
            • --proto_path,就是你的proto文件所在目錄是哪。我這里是D:\lsh_download\protoc-3.6.1-win32\bin。
            • --java_out,標識輸出的java文件應該放在哪個目錄。這里的 ./ 是指當前目錄。
            • protoDemo.proto,就是我們要編譯的文件。
    • 關於protoc命令參數,大家可以在cmd窗口輸入protoc --help 然后回車得到。
    • 安裝protobuf,這里我選擇maven安裝。
      <dependency>
                  <groupId>com.google.protobuf</groupId>
                  <artifactId>protobuf-java</artifactId>
                  <version>3.6.0</version>
              </dependency>
      View Code
    • protobuf API的使用:
      • java文件,如上.proto文件得到的.java文件,我的文件名是ProtoDemo.java.
      • 調用API做什么?
        • 序列化;
        • 反序列化。
      • 編寫序列化和反序列化代碼如下:
        package demo.protobuf;
        
        import java.io.FileInputStream;
        import java.io.FileOutputStream;
        import java.io.IOException;
        
        import demo.protobuf.ProtoDemo.demo.Builder;
        
        public class SerialAndDesial {
            
            public static void main(String[] args) {
                Builder b = ProtoDemo.demo.newBuilder();
                b.setEmail("dave_peter@foxmail.com");
                b.setId(1);
                b.setName("lsh");
                
                ProtoDemo.demo protoDemo = b.build();
                
                    FileOutputStream output;
                    try {
                        //write
                        output = new FileOutputStream("proto.ser");
                        protoDemo.writeTo(output);
                        output.close();
                        
                        //read
                        ProtoDemo.demo protoDemo2 = ProtoDemo.demo.parseFrom(new FileInputStream("proto.ser"));
                        System.out.println(protoDemo2);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            }
        
        }
        View Code
      • 執行結果如下:

  • 參考資料:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM