文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
一背景介绍
序列化与反序列化是我们日常数据持久化和网络传输中经常使用的技术 , 但是目前各种序列化框架让人眼花缭乱 , 不清楚什么场景到底采用哪种序列化框架 。 本文会将业界开源的序列化框架进行对比测试 , 分别从通用性、易用性、可扩展性、性能和数据类型与Java语法支持五方面给出对比测试 。
通用性:通用性是指序列化框架是否支持跨语言、跨平台 。
易用性:易用性是指序列化框架是否便于使用、调试 , 会影响开发效率 。
可扩展性:随着业务的发展 , 传输实体可能会发生变化 , 但是旧实体有可能还会被使用 。 这时候就需要考虑所选择的序列化框架是否具有良好的扩展性 。
性能:序列化性能主要包括时间开销和空间开销 。 序列化的数据通常用于持久化或网络传输 , 所以其大小是一个重要的指标 。 而编解码时间同样是影响序列化协议选择的重要指标 , 因为如今的系统都在追求高性能 。
Java数据类型和语法支持:不同序列化框架所能够支持的数据类型以及语法结构是不同的 。 这里我们要对Java的数据类型和语法特性进行测试 , 来看看不同序列化框架对Java数据类型和语法结构的支持度 。
下面分别对JDK Serializable、FST、Kryo、Protobuf、Thrift、Hession和Avro进行对比测试 。
二序列化框架
1JDK Serializable
JDK Serializable是Java自带的序列化框架 , 我们只需要实现java.io.Serializable或java.io.Externalizable接口 , 就可以使用Java自带的序列化机制 。 实现序列化接口只是表示该类能够被序列化/反序列化 , 我们还需要借助I/O操作的ObjectInputStream和ObjectOutputStream对对象进行序列化和反序列化 。
下面是使用JDK 序列化框架进行编解码的Demo:
/** * 编码 */publicstaticbyte[
encoder(Object ob) throws Exception{//用于缓冲字节数字ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//序列化对象ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);objectOutputStream.writeObject(ob);byte[
result = byteArrayOutputStream.toByteArray();//关闭流objectOutputStream.close();byteArrayOutputStream.close();return result;/** * 解码 */publicstatic <T> T decoder(byte[
bytes) throws Exception {ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);T object = (T) objectInputStream.readObject();objectInputStream.close();byteArrayInputStream.close();returnobject;
通用性
由于是Java内置序列化框架 , 所以本身是不支持跨语言序列化与反序列化 。
易用性
作为Java内置序列化框架 , 无序引用任何外部依赖即可完成序列化任务 。 但是JDK Serializable在使用上相比开源框架难用许多 , 可以看到上面的编解码使用非常生硬 , 需要借助ByteArrayOutputStream和ByteArrayInputStream才可以完整字节的转换 。
可扩展性
JDK Serializable中通过serialVersionUID控制序列化类的版本 , 如果序列化与反序列化版本不一致 , 则会抛出java.io.InvalidClassException异常信息 , 提示序列化与反序列化SUID不一致 。
- Java|成功人士都喜欢什么样的手机?这几款外表商务,功能还非常强大
- Java|行业唯一!企查查入选2021年中国互联网综合实力前百强企业
- 星巴克|2021 年游戏开发中的 10 大编程语言:C++、Java、C#......
- 小米科技|Java培训:7个简单的Java性能调优技巧
- |关于电气主回路常用电路符号及单母线分段供电的介绍,纯知识点!
- 氧化铝|吸附剂知识普及(上)—选择和工业上常用的类别
- Java|京东商场选择客服外包能解决哪些问题?
- Java|2022年如何学习自动化测试?
- 科大讯飞|直播间流量的几种来源!
- Java|在Java开发领域开始职业生涯