zoukankan      html  css  js  c++  java
  • 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_ = "";
        }
  • 相关阅读:
    python脚本 快速执行mapreduce程序
    ArrayList中contains()的使用方法
    利用jstl标签实现国际化
    device eth0 does not seem to be present, delaying initialization
    java中compareTo和compare方法之比较
    CentOS 7 NAT模式LVS搭建
    CentOS 7 DR模式LVS搭建
    CentOS 7 开机延迟解决办法
    CentOS 7 nginx+tomcat9 session处理方案之session复制
    Jumpserver(跳板机、堡垒机)启动jms Django连接mysql数据库报错
  • 原文地址:https://www.cnblogs.com/luo-c/p/15017723.html
Copyright © 2011-2022 走看看