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_ = "";
        }
  • 相关阅读:
    仿新浪首页、主题、详情页,纯html静态页面
    hdoj 4790 Just Random 【数学】
    Codeforces 97B Superset 平面分治
    HDU 1017 A Mathematical Curiosity【看懂题意+穷举法】
    Codeforces Round #221 (Div. 2) D
    一个bug在redmine中的诞生到终结
    hi3531 SDK已编译文件系统制作jffs2文件系统镜像并解决这个问题 .
    js前端3des加密 后台java解密
    进程经常使用小知识汇总
    泛型集合的使用
  • 原文地址:https://www.cnblogs.com/luo-c/p/15017723.html
Copyright © 2011-2022 走看看