protocol buff

发布时间:2019-11-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了protocol buff脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

PRotocol buff 协议使用

gIThub:
https://github.com/chengbingh...
(https://github.com/chengbingh...

1 简述

 protocol buffGOOGLE 的一种数据交换的格式,它独立于语言,独立于平台。可以用于java 对象序列话,(Java序列化协议也是一种协议)。两者都可以将对象序列化成字节数组,或者说是二进制数据,同时也可以反序列化   

2 protoc.exe 的使用

protoc.exe 生成一个java 文件  1 需要软件:protoc.exe 用于按照谷歌的要求通过一个配置文件生成java 类 2 创建一个配置文件:    

        option java_package="com.hcb.proto";  //包名         option java_outer_classname="playerModule";  //类名         message PBplayer{    // 是上述PlayerModule 中的一个内部类         required int64 playerId =1;  //required 表示必须有值,int64表示java中的long                  required int32 age = 2;               required string name = 3;                  rePEated int32 skills = 4;  //repeated 表示可以有多个,表示集合         }         message  Xxplayer{}  //可以写多个, 

3 执行脚本 创建一个xxx.bat 文件,文件中有如下命令, 
        protoc ./player.proto  --java_out=./         pause   //pause表示停顿,参考bat 脚本。

上述3步即可生成一个java 文件

3.序列化和反序列化

========

导入jar:protobuf-java-2.4.1.jar
package com.proto;

import java.util.Arrays;
import com.proto.PlayerModule.PBPlayer;
import com.proto.PlayerModule.PBPlayer.Builder;

public class PB2Bytes {

public static void main(String[] args) throws Exception {     byte[] bytes = toBytes();     toPlayer(bytes);  }  /**  * 序列化  */ public static byte[] toBytes(){     //获取一个PBPlayer的构造器,用于创建PBPlayer     Builder builder = PlayerModule.PBPlayer.newBuilder();     //设置数据     builder.setPlayerId(101).setAge(20).setName("peter").addSkills(1001).addSkills(1002);     //构造出对象     PBPlayer player = builder.build();     //序列化成字节数组     byte[] byteArray = player.toByteArray();          System.out.println(Arrays.toString(byteArray));          return byteArray; }  /**  * 反序列化  * @param bs  * @throws Exception   */ public static void toPlayer(byte[] bs) throws Exception{           PBPlayer player = PlayerModule.PBPlayer.parseFrom(bs);            System.out.println("playerId:" + player.getPlayerId());      System.out.println("age:" + player.getAge());      System.out.println("name:" + player.getName());      System.out.println("skills:" + (Arrays.toString(player.getSkillsList().toArray()))); }

}

4 总结

  一般使用protocol buffer 序列化要比单程的使用java 对象流产生的字节数组差距极大,本人的测试用用例对比如下:  序列化一个仅有4个属性,集合属性仅仅有2个元素。的对象 
        private long playerId;                  private int age;                  private String name;                  private List<Integer> skills = new ArrayList<>();

使用protocol buffer 结果如下:


[8, 101, 16, 20, 26, 5, 112, 101, 116, 101, 114, 32, -23, 7, 32, -22, 7] 

使用JAVA 对象流


[-84, -19, 0, 5, 115, 114, 0, 15, 99, 111, 109, 46, 106, 97, 118, 97, 46, 80, 108, 97, 121, 101, 114, -73, 43, 28, 39, -119, -86, -125, -3, 2, 0, 4, 73, 0, 3, 97, 103, 101, 74, 0, 8, 112, 108, 97, 121, 101, 114, 73, 100, 76, 0, 4, 110, 97, 109, 101, 116, 0, 18, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 76, 0, 6, 115, 107, 105, 108, 108, 115, 116, 0, 16, 76, 106, 97, 118, 97, 47, 117, 116, 105, 108, 47, 76, 105, 115, 116, 59, 120, 112, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 101, 116, 0, 5, 112, 101, 116, 101, 114, 115, 114, 0, 19, 106, 97, 118, 97, 46, 117, 116, 105, 108, 46, 65, 114, 114, 97, 121, 76, 105, 115, 116, 120, -127, -46, 29, -103, -57, 97, -99, 3, 0, 1, 73, 0, 4, 115, 105, 122, 101, 120, 112, 0, 0, 0, 2, 119, 4, 0, 0, 0, 2, 115, 114, 0, 17, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 73, 110, 116, 101, 103, 101, 114, 18, -30, -96, -92, -9, -127, -121, 56, 2, 0, 1, 73, 0, 5, 118, 97, 108, 117, 101, 120, 114, 0, 16, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 78, 117, 109, 98, 101, 114, -122, -84, -107, 29, 11, -108, -32, -117, 2, 0, 0, 120, 112, 0, 0, 3, -23, 115, 113, 0, 126, 0, 7, 0, 0, 3, -22, 120] 

脚本宝典总结

以上是脚本宝典为你收集整理的protocol buff全部内容,希望文章能够帮你解决protocol buff所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。