Protobuf的上手使用

这里不赘述Json和Protobuf的比较和区别,只谈谈简单的使用

1.在Client-Server交互的过程中,都是以二进制数据传输,所以Json和Protobuf在使用的过程中,都存在序列化和反序列的过程

2.使用json封装的数据,在通信(序列化-反序列化)的过程中,可以直接在工程中定义二进制数据需要映射成的类,有很多第三方的解析工具,jackson,fastjson等

  而Protobuf一般都是使用google提供的解析工具,没有办法直接定义一些类去进行映射需要

    A)通过定义proto文件,proto文件里面存放的是 按照googel定义的消息格式编写的一些对象消息,

       只要实现相同的协议格式即同一proto文件,可以被编译成不同的语言版本(Java,C++,Python等)

     如下:定义一个User.proto文件

option java_package="**.**";  
option java_outer_classname="****";

message User{
    required int32 ID=1;
    required string userName=2;
    required string Password=3;
    repeated string address=4;
}

      java_package 指定得到的包名(package ××××)

      java_outer_classname 指定最后输出的文件名    

   B)用 protoc.exe 生成User.proto的协议文件(Windows):protoc工具需要下载

    进入到proto.exe所在目录,执行  protoc.exe --java_out=. User.proto

      也可以直接安装protobuf,linux环境也是需要安装protobuf (具体可以看linux安装配置protobuf)

   C)命令执行成功之后,会生成proto文件中的约定,生成对应的java文件,有了这个java文件,才能对protobuf封装过的二进制数据完成对象的映射

   D)测试类

     protobuf对象->二进制数据->protobuf对象

public class Test {

    private static byte[] encode(UserProto.User user) {
        return user.toByteArray();
    }

    private static UserProto.User decode(byte[] body)
            throws InvalidProtocolBufferException {
        return UserProto.User.parseFrom(body);
    }

    public static void main(String[] args)
            throws InvalidProtocolBufferException {

        UserProto.User.Builder builder = UserProto.User.newBuilder();
        builder.setID(1);
        builder.setUserName("Lilinfeng");
        builder.setPassword("Netty Book");
        List<String> address = new ArrayList<String>();
        address.add("NanJing YuHuaTai");
        address.add("BeiJing LiuLiChang");
        address.add("ShenZhen HongShuLin");
        builder.addAllAddress(address);
        UserProto.User user = builder.build();

        System.out.println("Before encode : " + user.toString());
        UserProto.User user2 = decode(encode(user));
        System.out.println("After decode : " + user2.toString());
        System.out.println("Assert equal : --> " + user2.equals(user));

    }

}

   注:上述示例的proto文件遵循的是protobuf2的标准(syntax = "proto2")

          如果是protobuf3的标准,需要在首行加上syntax = "proto3" 用以说明,并且需要使用对应版本的 protoc 工具

          使用不同小版本的 protoc 得到的.java文件可能不同,向下兼容,只需要大版本相互保持一致

原文地址:https://www.cnblogs.com/xuzekun/p/8947812.html