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