Netty学习07--Protocol Buff

叁歲伎倆 2023-02-17 13:25 111阅读 0赞

1.protocol buff是一种协议,是谷歌推出的一种序列化协议

2.Java序列化协议也是一种协议

3.两者的目的是,将对象序列化成字节数组,或者说是二进制数据

下面使用代码来体现两者的区别

目录结构

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMzcxNzY2_size_16_color_FFFFFF_t_70

protoc.exe 编译工具

build.bat 编译脚本

  1. protoc ./proto/*.proto --java_out=./src
  2. pause

player.proto 更多请参考

  1. option java_package = "com.proto";
  2. option java_outer_classname = "PlayerModule";
  3. message PBPlayer{
  4. required int64 playerId = 1;
  5. required int32 age = 2;
  6. required string name = 3;
  7. repeated int32 skills = 4;
  8. }
  9. message PBResource{
  10. required int64 gold = 1;
  11. required int32 energy = 2;
  12. }
  13. PlayerModule 通过执行build.bat会自动生成
  14. PB2Bytes
  15. package com.proto;
  16. import java.util.Arrays;
  17. import com.proto.PlayerModule.PBPlayer;
  18. import com.proto.PlayerModule.PBPlayer.Builder;
  19. /**
  20. * protobuf学习
  21. */
  22. public class PB2Bytes {
  23. public static void main(String[] args) throws Exception {
  24. byte[] bytes = toBytes();
  25. toPlayer(bytes);
  26. }
  27. /**
  28. * 序列化
  29. */
  30. public static byte[] toBytes(){
  31. //获取一个PBPlayer的构造器
  32. Builder builder = PBPlayer.newBuilder();
  33. //设置数据
  34. builder.setPlayerId(101).setAge(20).setName("peter").addSkills(1001);
  35. //构造出对象
  36. PBPlayer player = builder.build();
  37. //序列化成字节数组
  38. byte[] byteArray = player.toByteArray();
  39. System.out.println(Arrays.toString(byteArray));
  40. return byteArray;
  41. }
  42. /**
  43. * 反序列化
  44. * @param bs
  45. * @throws Exception
  46. */
  47. public static void toPlayer(byte[] bs) throws Exception{
  48. PBPlayer player = PBPlayer.parseFrom(bs);
  49. System.out.println("playerId:" + player.getPlayerId());
  50. System.out.println("age:" + player.getAge());
  51. System.out.println("name:" + player.getName());
  52. System.out.println("skills:" + (Arrays.toString(player.getSkillsList().toArray())));
  53. }
  54. }

运行效果:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMzcxNzY2_size_16_color_FFFFFF_t_70 1

JAVA的序列化和反序列化

  1. Player
  2. package com.java;
  3. import java.io.Serializable;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. /**
  7. * 玩家对象
  8. */
  9. public class Player implements Serializable{
  10. private static final long serialVersionUID = -5248069984631225347L;
  11. public Player(long playerId, int age, String name) {
  12. this.playerId = playerId;
  13. this.age = age;
  14. this.name = name;
  15. }
  16. private long playerId;
  17. private int age;
  18. private String name;
  19. private List<Integer> skills = new ArrayList<>();
  20. public long getPlayerId() {
  21. return playerId;
  22. }
  23. public void setPlayerId(long playerId) {
  24. this.playerId = playerId;
  25. }
  26. public int getAge() {
  27. return age;
  28. }
  29. public void setAge(int age) {
  30. this.age = age;
  31. }
  32. public String getName() {
  33. return name;
  34. }
  35. public void setName(String name) {
  36. this.name = name;
  37. }
  38. public List<Integer> getSkills() {
  39. return skills;
  40. }
  41. public void setSkills(List<Integer> skills) {
  42. this.skills = skills;
  43. }
  44. }
  45. JAVA2Bytes
  46. package com.java;
  47. import java.io.ByteArrayInputStream;
  48. import java.io.ByteArrayOutputStream;
  49. import java.io.IOException;
  50. import java.io.ObjectInputStream;
  51. import java.io.ObjectOutputStream;
  52. import java.util.Arrays;
  53. public class JAVA2Bytes {
  54. public static void main(String[] args) throws Exception {
  55. byte[] bytes = toBytes();
  56. toPlayer(bytes);
  57. }
  58. /**
  59. * 序列化
  60. * @throws IOException
  61. */
  62. public static byte[] toBytes() throws IOException{
  63. Player player = new Player(101, 20, "peter");
  64. player.getSkills().add(1001);
  65. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  66. ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
  67. //写入对象
  68. objectOutputStream.writeObject(player);
  69. //获取 字节数组
  70. byte[] byteArray = byteArrayOutputStream.toByteArray();
  71. System.out.println(Arrays.toString(byteArray));
  72. return byteArray;
  73. }
  74. /**
  75. * 反序列化
  76. * @param bs
  77. * @throws Exception
  78. */
  79. public static void toPlayer(byte[] bs) throws Exception{
  80. ObjectInputStream inputStream = new ObjectInputStream(new ByteArrayInputStream(bs));
  81. Player player = (Player)inputStream.readObject();
  82. //打印
  83. System.out.println("playerId:" + player.getPlayerId());
  84. System.out.println("age:" + player.getAge());
  85. System.out.println("name:" + player.getName());
  86. System.out.println("skills:" + (Arrays.toString(player.getSkills().toArray())));
  87. }
  88. }

测试效果

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMzcxNzY2_size_16_color_FFFFFF_t_70 2

通过运行效果得知,java的序列化生成的字节比protoc方式更占内存。

代码下载​​​​​​​

发表评论

表情:
评论列表 (有 0 条评论,111人围观)

还没有评论,来说两句吧...

相关阅读

    相关 netty 学习

    [Netty简介及应用场景\_程序员杂谈的博客-CSDN博客][Netty_-CSDN] [工作了5年,你真的理解Netty以及为什么要用吗?(深度干货) - 跟着Mic学架

    相关 Netty学习07--Protocol Buff

    1.protocol buff是一种协议,是谷歌推出的一种序列化协议 2.Java序列化协议也是一种协议 3.两者的目的是,将对象序列化成字节数组,或者说是二进制数据  

    相关 Netty自学-Netty学习(一)

    什么Netty? Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客

    相关 Netty序列化协议Protocol buff

    序列化协议 序列化和反序列化 把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化。用途:文件的copy、网络数据的传输 Pro