protobuff協議

1.什麼是protobuff協議?
Protobuf(Google Protocol Buffers)是google開發的的一套用於數據存儲,網絡通訊時用於協議編解碼的工具庫.它和XML和Json數據差很少,把數據已某種形式保存起來.Protobuf相對與XML和Json的不一樣之處,它是一種二進制的數據格式,具備更高的傳輸,打包和解包效率.
2.protobuf在java方面的應用。
1):下載安裝。https://download.csdn.net/download/antgan/9593735
2):配置環境變量。
3)設計對象
。。。。
4)描述對象
package tutorial;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
4.編譯描述
cmd>protoc --java_out . xxx.proto
5.導入源代碼到項目中
6.使用對象java

3、 Eclipse新建項目
我使用maven構建protobuf項目,方便引入protobuf-java-2.5.0.jar依賴。
在項目根目錄建立proto文件夾,存放proto文件。
這裏寫圖片描述
maven依賴pom.xml網絡


com.google.protobuf
protobuf-java
2.5.0
maven

4、編寫.proto文件
在proto文件夾下編寫person-entity.proto,以下(proto協議的規則點這查看)工具

option java_outer_classname = "PersonEntity";//生成的數據訪問類的類名
message Person {
required int32 id = 1;//同上
required string name = 2;//必須字段,在後面的使用中必須爲該段設置值
optional string email = 3;//可選字段,在後面的使用中能夠自由決定是否爲該字段設置值
}測試

4、使用protoc.exe編譯成java類
有兩種方法:ui

  1. 使用Java Rumtime執行cmd命令
  2. 直接打開cmd運行命令也行。google

  3. 使用Java Rumtime執行cmd命令
    util包下新建GenerareClass類
    這裏寫圖片描述.net

/**設計

  • protoc.exe
  • @author ganhaibin
  • */
    public class GenerateClass {
    public static void main(String[] args) {
    String protoFile = "person-entity.proto";//
    String strCmd = "d:/dev/protobuf-master/src/protoc.exe -I=./proto --java_out=./src/main/java ./proto/"+ protoFile;
    try {
    Runtime.getRuntime().exec(strCmd);
    } catch (IOException e) {
    e.printStackTrace();
    }//經過執行cmd命令調用protoc.exe程序
    }
    }

命令格式以下。code

protoc.exe -I=proto的輸入目錄 --java_out=java類輸出目錄 proto的輸入目錄包括包括proto文件
1

  1. 直接打開cmd運行命令
    這裏寫圖片描述

生成的PersonEntity.java類

這裏寫圖片描述

5、測試
編寫Test類,模擬序列化和反序列化過程。

public class Test {
public static void main(String[] args) throws IOException {
//模擬將對象轉成byte[],方便傳輸
PersonEntity.Person.Builder builder = PersonEntity.Person.newBuilder();
builder.setId(1);
builder.setName("ant");
builder.setEmail("ghb@soecode.com");
PersonEntity.Person person = builder.build();
System.out.println("before :"+ person.toString());

System.out.println("===========Person Byte==========");
    for(byte b : person.toByteArray()){
        System.out.print(b);
    }
    System.out.println();
    System.out.println(person.toByteString());
    System.out.println("================================");

    //模擬接收Byte[],反序列化成Person類
    byte[] byteArray =person.toByteArray();
    Person p2 = Person.parseFrom(byteArray);
    System.out.println("after :" +p2.toString());
}

}

輸出以下 這裏寫圖片描述

相關文章
相關標籤/搜索