protobuf的序列化和反序列化


對於PB數據的序列化和反序列化,如:對於經過 protoc編譯的 Person.proto文件,編譯后為 PersoProtobuf.java文件,那么,對於只看到PersoProtobuf.java文件,而看不到原來的Person.proto文件來說,如何序列化。

示例如下:

public class serializablePractice {
    public static void main(String[] args) {

        //  序列化
        // 創建Person的Builder
        PersonProtobuf.Person.Builder personBuilder =
                PersonProtobuf.Person.newBuilder(); //靜態的內部類,因為是靜態的,所以可以直接用類名調用, .Person是如何來的,就是看PersonProtobuf內部類的static final class *** extends com.google.protobuf.GeneratedMessageV3
        // 設置Person的屬性,往里面寫入屬性值,形成一個特定的對象
        personBuilder.setAge(18);
        personBuilder.setName("張三豐");
        // 創建Person
        PersonProtobuf.Person zhangsanfeng = personBuilder.build();
        // 序列化,byte[]可以被寫到磁盤文件,或者通過網絡發送出去。
        byte[] data = zhangsanfeng.toByteArray(); //轉換成字節碼
        //byte[] data = personBuilder.build().toByteArray();
        System.out.println("serialization end.");

        // 反序列化,byte[]可以讀文件或者讀取網絡數據構建。
        System.out.println("deserialization begin.");
        try {
            PersonProtobuf.Person person = PersonProtobuf.Person.parseFrom(data);
            System.out.println(person.getAge());
            System.out.println(person.getName());
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
    }
}

 

如下為PersoProtobuf.java中的一小段代碼,這是 protoc自動生成的。他繼承了 com.google.protobuf.GeneratedMessageV3 ,並實現了接口 PersonOrBuilder 。

  /**
   * Protobuf type {@code Person}
   */
  public static final class Person extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:Person)
      PersonOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use Person.newBuilder() to construct.
    private Person(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private Person() {
      name_ = "";
    }

 


免責聲明!

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



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