步骤1:添加对应的依赖
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.7.1</version>
</dependency>
步骤2:编写bulid.bat文件执行,使用protoc.exe工具
bat文件内容:
[使用user.proto文件生成可序列化和反序列化文件到./src/main/java目录下]
protoc ./proto/user.proto --java_out=./src/main/java
pause
步骤3:编写user.proto文件
内容:
【
java_package定义包名,java_outer_classname定义java类名 message User[当作实体类名]
string userId = 1; 【java String类型】
int32 age = 2; 【java int类型】
string userName = 3; 【java String类型】
repeated string favorite = 4; 【java String[]数组】
】
syntax = "proto3";
option java_package = "com.bfxy.netty.protobuf";
option java_outer_classname = "UserModule";
message User {
string userId = 1;
int32 age = 2;
string userName = 3;
repeated string favorite = 4;
}
步骤4:执行bulid.bat文件生成:UserModule.java
步骤5:创建测试类实现序列化和反序列化
------------------------------------------------------
UserModule.java
import java.util.Arrays;
import com.google.protobuf.InvalidProtocolBufferException;
public class TestProtobuf {
/**
* serialObject2Bytes 序列化
* @return
*/
public static byte[] serialObject2Bytes() {
UserModule.User.Builder userBuilder = UserModule.User.newBuilder();
userBuilder
.setUserId("1001")
.setAge(30)
.setUserName("张三")
.addFavorite("足球")
.addFavorite("撸码");
UserModule.User user = userBuilder.build();
/**
* 序列化机制:
* 1. java序列化 比如一个int类型(4个字节长度)
* // int a = 2 & int a = 110000000
* java的序列化无论真是的int类型数值大小实际占用多少个字节,在内存中都是以4个长度(32位)
* protobuf序列化机制:
* 是按照实际的数据大小去动态伸缩的, 因此很多时候我们的int数据并没有实际占用到4个字节
* 所以protobuf序列化后一般都会比int类型(java序列化机制)的占用长度要小很多!
*/
byte[] data = user.toByteArray();
System.err.println(Arrays.toString(data));
return data;
}
/**
* $serialBytes2Object 反序列化
* @param data
* @return
*/
public static UserModule.User serialBytes2Object(byte[] data) {
try {
return UserModule.User.parseFrom(data);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
byte[] data = serialObject2Bytes();
UserModule.User user = serialBytes2Object(data);
System.err.println("userId: " + user.getUserId());
System.err.println("age: " + user.getAge());
System.err.println("userName: " + user.getUserName());
System.err.println("favorite: " + user.getFavoriteList());
}
}