java中使用protobuf序列化实例

一、生成序列化文件前准备
开发工具:IDEA。
1.安装识别protobuf的文件,百度找了一下安装的是“protubuf support”,查找没找到。我安装的是“protobuf Generator”。
java中使用protobuf序列化实例_第1张图片
安装完成之后,重启IDEA。会识别出.proto文件,文件里的类型和变量默认值会显示颜色。
java中使用protobuf序列化实例_第2张图片
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目录下
java中使用protobuf序列化实例_第3张图片
环境变量配置如下
java中使用protobuf序列化实例_第4张图片

二、根据proto文件生成序列化.java文件
打开cmd目录,输入protoc,查看是否配置成功,如果出现“Missing input file”说明配置成功。
java中使用protobuf序列化实例_第5张图片
生成序列化java文件的话,定位到.proto文件所在的目录。输入protoc --java_out=. xxx.proto 没有报错就说明生成成功,查看项目目录下是否生成.java文件。
在这里插入图片描述
生成的.java文件如下。每个人根据proto文件内容不同生成不同的java文件。
java中使用protobuf序列化实例_第6张图片
三、使用生成的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数组。

你可能感兴趣的:(java,java,protobuf)