protobuf 序列化 使用


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM