zoukankan      html  css  js  c++  java
  • 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文件可能不同,向下兼容,只需要大版本相互保持一致

  • 相关阅读:
    写在最前面
    Bzoj 2281 [Sdoi2011]黑白棋 题解
    bzoj3125: CITY 题解
    CDQZ 集训大总结
    CDQZ集训DAY10 日记
    CDQZ集训DAY9 日记
    CDQZ集训DAY7 日记
    CDQZ集训DAY6 日记
    CDQZ集训DAY5 日记
    CDQZ集训DAY4 日记
  • 原文地址:https://www.cnblogs.com/xuzekun/p/8947812.html
Copyright © 2011-2022 走看看