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()
