對於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_ = ""; }