protocol buff是一种协议,是谷歌推出的一种序列化协议 .Java序列化协议也是一种协议
两者的目的是,将对象序列化成字节数组,或者说是二进制数据
导包
<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.5.1</version> </dependency>
创建 demo.proto 文件
option java_package = "com.proto"; option java_outer_classname = "PlayerModule"; message PBPlayer{ required int64 playerId = 1; required int32 age = 2; required string name = 3; repeated int32 skills = 4; } message PBResource{ required int64 gold = 1; required int32 energy = 2; }
由工具protoc.exe 使用 bat命令 生成 Java文件
protoc ./proto/*.proto --java_out=./src pause
对象序列化
//获取一个构造器 Builder builder = PlayerModule.PBPlayer.newBuilder(); //设置数据 builder.setPlayerId(101).setAge(20).addSkills(1011); //构造出对象 PBPlayer player = builder.build(); //序列化成字节数组 return player.toByteArray();
toByteArray -> writeTo(生成的类自己实现的)
反序列化
PBPlayer pbPlayer = PlayerModule.PBPlayer.parseFrom(byte);
自定义序列化
将一个int数据序列化
4个字节 字节序,简单来说,就是指的超过一个字节的数据类型在内存中存储的顺序
可采用两种方式序列化啊
大端字节序:
高位字节数据存放在低地址处,低位数据存放在高地址处;
小段字节序:
高位字节数据存放在高地址处,低位数据存放在低地址处;
TCP/IP协议传输数据时,字节序默认大端。
public static byte[] int2bytes(int i) { byte[] bytes = new byte[4]; bytes[0] = (byte)(i >> 3*8); //0000 bytes[1] = (byte)(i >> 2*8); //0000 bytes[2] = (byte)(i >> 1*8); //0000 bytes[3] = (byte)(i >> 0*8); //00i return bytes; } public static int byte2int(byte[] bytes) { return (bytes[0] << 3*8) | (bytes[0] << 2*8) | (bytes[0] << 1*8) | (bytes[0] << 0*8); }
也可以使用NIO的ByteBuffer
ByteBuffer buffer = ByteBuffer.allocate(8); buffer.putInt(id); buffer.putInt(age); ByteBuffer buffer2 = ByteBuffer.wrap(buffer.array()); buffer2.getInt()