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_ = "";
    }

 

posted @ 2021-07-15 21:53  星海寻梦233  阅读(1772)  评论(0编辑  收藏  举报