protobuf 序列化 使用

时间:2021-04-26 21:11:29

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协议传输数据时,字节序默认大端

protobuf 序列化 使用

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