网站首页 > 博客文章 正文
知识要点
- JAVA默认序列化
- MessagePack序列化工具
- protobuf序列化工具
本文对以上三种序列化后流大小比较以及工具简单的使用
- JAVA默认序列化
//实现Serializable接口
User user = new User();
user.setId(1);
user.setName("张三");
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream outputStream = new ObjectOutputStream(out);
outputStream.writeObject(user);
outputStream.flush();
outputStream.close();
byte[] byteArrays = out.toByteArray();
System.out.println("java序列化的流大小:"+byteArrays.length);
//输出结果:java序列化的流大小:187
- MessagePack序列化工具
对于Maven用户,在pom.xml文件中添加以下命令:
<dependency>
<groupId>org.msgpack</groupId>
<artifactId>msgpack</artifactId>
<version>0.6.12</version>
</dependency>
MessagePack代码示例:
//注:使用MessagePack序列化时,该对象必须在类上加@Message注解
User user = new User();
user.setId(1);
user.setName("张三");
MessagePack msgpk = new MessagePack();
byte[] msgBtyes = msgpk.write(user);
System.out.println("MessagePack序列化后流的大小:"+msgBtyes.length);
//输出结果:MessagePack序列化后流的大小:9
//反序列化对象
User userNew =msgpk.read(msgBtyes,User.class);
- protobuf序列化工具(推荐使用)
添加依赖:protobuf
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.9.0-rc-1</version>
</dependency>
说明:因protobuf是用C ++编写的。对于非C ++用户,需要从github上下载预构建的二进制文件:https://github.com/protocolbuffers/protobuf/releases ,
找到对应自己系统版本,找到C++最新版本的:protoc-3.9.0-rc-1-win64.zip,下载好后解压,后续会通过cmd命令生产java文件。
注:maven中protobuf的version要与你下载的生成器版本保持一致,不然会出现很多问题。
1、手动新建User.proto文件
syntax = "proto2";//固定
package protobuf; //当前文件路径
option java_package = "com.protobuf";//生成Java类后存放路径,生成java文件时会自动创建
option java_outer_classname = "UserProto";//类名,UserProto.java
//内部类,用来保存实例对象
message UserProtoBuf {
required int64 id = 1; // 类型Long 指定唯一序号, 这个主要用于列对应的值
required string name = 2;
}
2、cmd命令进入到我们下载的工具bin路径下,我的放在D盘,执行以下命令:
protoc -I=D:\tools\src\protobuf --java_out=D:\tools\src\main\java\com\protobuf User.proto
说明: -I=D:\tools\src\protobuf 表示你User.proto的物理路径
--java_out=D:\tools\src\main\java 表示生成java类保存的路径
User.proto 表示你对哪一个proto文件生成java类
3、 检查指定路径下是否生成的UserProto.java
UserProto.java类中会有部分方法java.lang.Override报错,这是因为JDK版本原因,删掉即可。
如果出现部分方法错误,请检查自己的maven版本号和生成器的版本号是否一致。
- protobuf代码示例
//经典的链式调用
//对内部类赋值
UserProto.UserProtoBuf userProBuf = UserProto.UserProtoBuf.newBuilder().setId(1L).setName("张三").build();
byte[] bytes = user.toByteArray();
System.out.println("protobuf流长度:" + bytes.length);
//输出结果protobuf流长度:10
//至于为什么长度比messagePack还多1个,大家可以多加些字段试试
//反序列化调用
UserProto.UserProtoBuf user = UserProto.UserProtoBuf.parseFrom(byte[] data);
扩展要点:
1、如果有多个JAVA对象需要序列化,是否每个类都需要生成?
答:是的,有100个需要生成100个。
2、protobuf目前用到的场景
答:Netty的高性能就默认提供了对GoogleProtobuf的支持。
3、是否支持跨语言
答:在Google官方发布的源代码中包含了c++、java、Python三种语言。
- 上一篇: 简单介绍Protobuf协议
- 下一篇: 在Java程序中使用Protobuf
猜你喜欢
- 2025-01-13 gRPC Java入门示例
- 2025-01-13 Netflix 实用 API 设计第 1 部分:使用 Protobuf FieldMask
- 2025-01-13 netty系列之:使用Jboss Marshalling来序列化java对象
- 2025-01-13 避免重复造轮子,Java 程序员必备
- 2025-01-13 Avro、Protobuf和Thrift中的模式演变
- 2025-01-13 Netty 使用 Google 的 ProtoBuf 来传输数据
- 2025-01-13 自己动手从0开始实现一个分布式 RPC 框架
- 2025-01-13 Google Protobuf vs. Apache Avro
- 2025-01-13 比较序列化Kryo 和 Protobuf性能
- 2025-01-13 protobuf和其它几种序列化工具的性能对比分析
你 发表评论:
欢迎- 最近发表
-
- 给3D Slicer添加Python第三方插件库
- Python自动化——pytest常用插件详解
- Pycharm下安装MicroPython Tools插件(ESP32开发板)
- IntelliJ IDEA 2025.1.3 发布(idea 2020)
- IDEA+Continue插件+DeepSeek:开发者效率飙升的「三体组合」!
- Cursor:提升Python开发效率的必备IDE及插件安装指南
- 日本旅行时想借厕所、买香烟怎么办?便利商店里能解决大问题!
- 11天!日本史上最长黄金周来了!旅游万金句总结!
- 北川景子&DAIGO缘定1.11 召开记者会宣布结婚
- PIKO‘PPAP’ 洗脑歌登上美国告示牌
- 标签列表
-
- ifneq (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)