对于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_ = ""; }