java中使用protobuff序列化实例

tech2022-10-02  68

一、生成序列化文件前准备 开发工具:IDEA。 1.安装识别protobuff的文件,百度找了一下安装的是“protubuff support”,查找没找到。我安装的是“protobuff Generator”。 安装完成之后,重启IDEA。会识别出.proto文件,文件里的类型和变量默认值会显示颜色。 2.maven引用proto操作包,我引用的是3.0的版本。windows电脑安装或者配置proto.exe,此处的版本也得是3.0的版本,版本保持一致。生成的文件才不会报错。 protobuff工具包下载地址,网上也能找到。我提供我的下载地址。 链接:https://pan.baidu.com/s/1yQ-jmUuFcXncCs5WcPz8Iw 提取码:2q1g

<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.13.0</version> </dependency>

proto.exe有两种安装方式, a.直接把exe拷贝到cmd运行的系统环境目录下C:\Windows\System32; b.放入自己定义的文件夹,配置环境变量到自己定义的文件夹。我放在D:\service目录下 环境变量配置如下

二、根据proto文件生成序列化.java文件 打开cmd目录,输入protoc,查看是否配置成功,如果出现“Missing input file”说明配置成功。 生成序列化java文件的话,定位到.proto文件所在的目录。输入protoc --java_out=. xxx.proto 没有报错就说明生成成功,查看项目目录下是否生成.java文件。 生成的.java文件如下。每个人根据proto文件内容不同生成不同的java文件。 三、使用生成的java文件 1.赋值 以上文的CommonMsg为例 .proto文件内容

message CommonMsg { string version = 1; string type = 2; int32 encrypt = 3; int32 compress = 4; bytes data = 5; }

补充:就该消息体的定义的做简单说明 1. option java_package指定该proto文件生成的java类的包名 2. option java_outer_classname指定proto文件生成的java类的类名 3. message是消息定义的关键字,对应着java中的class,在该proto文件的生成的java类文件中,将会定义了一个内部类Student以及Student类的内部类PhoneNumber 4. required 、optional、repeated均为限制附,修饰消息体中的字段,说明如下: required:该字段为必要字段,既在序列化和反序列化之前该字段必须已经被赋值, 每个消息中可以包含0个或多个optional类型的字段 optional:该字段为非必要字段 repeated:表示的字段可以包含0个或多个数据,实际在生成的java类中,被repeated修饰的字段将被声明成一个List<字段类型>类型

赋值方法:

CommonMsg common = CommonMsg.newBuilder() .setVersion(version) .setType(reqName) .setCompress(0) .setEncrypt(0) .setData(data) .build(); ByteString AckBytes = common.getTypeBytes();

2.实例化获取值的值

CommonMsg msgReq = CommonMsg.parseFrom(AckBytes); System.out.println("接收到Server数据: " + msgReq.getType()); System.out.println("接收到Server数据: " + msgReq.getVersion());

其他java开发小总结

byte字节数组进行截取位数操作时,可以用到下面方法

System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length);

作用:将指定源数组中的数组从指定位置复制到目标数组的指定位置。 参数: src - 源数组。 srcPos - 源数组要复制的起始位置。 dest - 目标数组。 destPos - 目的数组放置的起始位置。 length - 要复制的长度 例:System.arraycopy(bytes1,0,arrayOfByte,0,bytes1.length); bytes1数组不截取字符地赋值给arrayOfByte数组。

最新回复(0)