protobuffer序列化

一. 描述对象的proto文件

  1. 第一行package:对象经过protobuffer编译后形成java文件,这个文件放在按照package新建的文件夹内
  2. java_package:java类的包名
  3. java_outer_classname:java文件名,也是public class的名字
  4. message定义内部类Person,Person也是要序列化的类
  5. required表示该字段是必须字段,optional是可选字段
  6. repeated根据不同的消息类型解析数据包内的字段,用于自定义的类,数组等
    ```shell
    package com.lj;
    option java_package="com.lj";
    option java_outer_classname="MyPerson";

    message Person{
    required string name=1;
    required int32 id=2;
    optional string email=3;

    message PhoneNumber{
    required string number=1;
    optional int32 type=2;
    }

    repeated PhoneNumber phoneNumber=4;
    }

    ```

二. 编译描述文件

protoc --proto_path=IMPORT_PATH --java_out=DST_DIR file.proto

三. 序列化与反序列化代码

  1. new Builder().build()方法创建序列化
  2. parseFrom()反序列化
    ```java
    public class TestProtocalBuffer {
    /**
    * protobuffer序列化 : 1.编写proto文件描述bean 2.命令生成代码 3.java代码调用
    * @param args
    * @throws IOException
    */
    public static void main(String[] args) throws IOException {

         MyPerson.Person p1 = MyPerson.Person.newBuilder()
                 .setName("lj").setId(25629).setEmail("lj72808up@163.com")
                 .addPhoneNumber(MyPerson.Person.PhoneNumber.newBuilder().setNumber("13905723516").setType(1)).build();
    
         FileOutputStream os = new FileOutputStream("d://123.txt");
         p1.writeTo(os);   // 把文件
         os.close();
    
     }
    
     /**
     * protobuffer读取文件反序列化成对象
     * @throws IOException
     */
     @Test
     public void testRead() throws IOException {
         FileInputStream is = new FileInputStream("d://123.txt");
         MyPerson.Person person = MyPerson.Person.parseFrom(is);
         System.out.println(person);
     }
     /**  name: "lj"
         id: 25629
         email: "lj72808up@163.com"
         phoneNumber {
         number: "13905723516"
         type: 1
         }                          **/

    }

    ```

转载于:https://www.cnblogs.com/72808ljup/p/5220961.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值