本文共 3056 字,大约阅读时间需要 10 分钟。
参考:
创建Maven项目,pom.xml文件添加如下内容:
3.6.1 1.18.0 com.google.protobuf protobuf-java ${protobuf.version} kr.motd.maven os-maven-plugin 1.5.0.Final org.xolstice.maven.plugins protobuf-maven-plugin 0.5.0 com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier} grpc-java io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} compile compile-custom
在main目录下新建proto文件夹,并将该文件夹设置为源代码目录(编译时会自动去这个目录下找proto文件),如下图:
在该目录下编写proto文件,这里写各测试的Person.proto,内容如下:
syntax = "proto3"; //标识是protobuffer3 ,默认是2package protobuffer.proto;option java_package = "com.heavy.learn.protobuffer";option java_outer_classname = "PersonPB";message Person { sint64 id = 1; int32 age = 2; string name=3; repeated float exam = 4; bool good =5; bytes byt = 6; double d = 7 ; enum Level { NORMAL= 0; GOOD= 1; BAD = 2; } Level level = 8; mapmap = 9; message list{ repeated Person ele=1; }}message Family{ repeated Person p =1;}
使用protobuf下的compile来编译,会生成java代码:
编写测试类,来使用序列化与反序列化
package com.heavy.learn.protobuffer;import com.google.protobuf.InvalidProtocolBufferException; import java.util.List; public class ProtoTest { public static void main(String[] args) { PersonPB.Person.Builder person = PersonPB.Person.newBuilder(); person.setAge(12); person.setId(1); person.setName("Jacky"); person.setExam(0,2.3f); person.setExam(1,2.4f); //设置map person.putMap("a",null); PersonPB.Family.Builder fa = PersonPB.Family.newBuilder(); fa.addP(person); System.out.println(person); //序列化 PersonPB.Person pinfo = person.build(); byte[] barr = pinfo.toByteArray(); System.out.println(barr.length); try { //反序列化 PersonPB.Person p= PersonPB.Person.parseFrom(barr); System.out.println(p); //获取list p.getExamList(); PersonPB.Family f = PersonPB.Family.parseFrom(fa.build().toByteArray()); Listlist = f.getPList(); for(PersonPB.Person px : list){ System.out.println(px.getAge()); } } catch (InvalidProtocolBufferException e) { e.printStackTrace(); } }}
转载地址:http://wjyxi.baihongyu.com/