protobuffer序列化
一. 描述对象的proto文件
- 第一行package:对象经过protobuffer编译后形成java文件,这个文件放在按照package新建的文件夹内
- java_package:java类的包名
- java_outer_classname:java文件名,也是public class的名字
- message定义内部类Person,Person也是要序列化的类
- required表示该字段是必须字段,optional是可选字段
- repeated根据不同的消息类型解析数据包内的字段,用于自定义的类,数组等
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
三. 序列化与反序列化代码
- new Builder().build()方法创建序列化
- parseFrom()反序列化
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 } **/ }