Java序列化技术性能分析(JDK原生与Protostuff)
熟悉Java的朋友应该知道Java有一个叫序列化的技术,即把一个Object转换为可保存,可传输的流数据。相应的,同时存在反序列化,即将流数据转换为Object类,而在转换的过程中,该Object保持者其自身的状态。不会应该序列化或者反序列化而丢失。通常在缓存中,RPC(远程调用),或者长久保存会话信息时,大有用处。
关于序列化的时候,大部分情况下想到的是对于需要序列化的对象实现Serializable标志接口,同时为该对象提供一个唯一的serialVersionUID。
示例代码
public class Person implements Serializable { private static final long serialVersionUID = -763618247875550322L; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; public class WhySerialversionUID { public static void main(String[] args) throws Exception { //这里是把对象序列化到文件 Person crab = new Person(); crab.setName("kaka"); ObjectOutputStream oo = new ObjectOutputStream (new FileOutputStream("kakaFile")); oo.writeObject(crab); oo.close(); //这里是把文件序列化到对象 ObjectInputStream oi = new ObjectInputStream (new FileInputStream("kakaFile")); Person kaka = (Person) oi.readObject(); //输出为Hi, My name is kaka System.out.println("Hi, My name is " + kaka.getName()); oi.close(); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
看起来使用JDK提供的序列化技术没有什么问题,其实不然。JDK提供的序列化技术相对而已效率较低。在转换二进制数组过程中空间利用率较差。github上有个专门对比序列化技术做对比的数据:https://github.com/eishay/jvm-serializers/wiki
其中看的出来性能最优的为google开发的colfer 。这个框架尽管性能优秀,但它太过于灵活,灵活到Schema都要开发者自己指定,所以对开发者不是很友好。我推荐使用Protostuff,其性能稍弱与colfer,但对开发者很友好,同时性能远远高于JDK提供的Serializable。
添加依赖:
<dependency><groupId>io.protostuff</groupId> <artifactId>protostuff-core</artifactId> <version>1.4.4</version> </dependency> <dependency> <groupId>io.protostuff</groupId> <artifactId>protostuff-runtime</artifactId> <version>1.4.4</version> </dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
简单使用:
private static RuntimeSchema<Person> schema = RuntimeSchema.createFrom(Person.class);
/**
*序列化
*/
Person crab = new Person();
crab.setName("kaka"); //参数三缓冲器 byte[] bytes = ProtostuffIOUtil.toByteArray(crab,schema,LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE)); /** *反序列化 */ // 空对象 Person newCrab = schema.newMessage(); ProtostuffIOUtil.mergeFrom(bytes,newCrab,schema); System.out.println("Hi, My name is " + newCrab.getName());
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
转载于:https://www.cnblogs.com/firstdream/p/7809357.html
Java序列化技术性能分析(JDK原生与Protostuff)相关推荐
- Java 序列化之 Externalizable
相关文章: Java 序列化 之 Serializable JDK中除了提供 Serializable 序列化接口外,还提供了另一个序列化接口Externalizable,使用该接口之后,之前基于Se ...
- Java序列化案例demo(包含Kryo、JDK原生、Protobuf、ProtoStuff以及hessian)
文章目录 前言 一.Kryo序列化(优先选择) 介绍 快速开始 测试 二.JDK原生序列化 介绍 快速开始 测试 三.Protobuf序列化 介绍 快速开始 测试 四.ProtoStuff 介绍 快速 ...
- Java拾遗:004 - JDK、Hadoop、Hessian序列化
2019独角兽企业重金招聘Python工程师标准>>> JDK序列化 在分布式架构中,序列化是分布式的基础构成之一,我们需要把单台设备上的数据通过序列化(编码.压缩)后通过网络传输给 ...
- java jdk 序列化_JDK 11:Java序列化的终结开始了吗?
java jdk 序列化 在博客文章" 将Google的协议缓冲区与Java结合使用 "中,我引用了乔什·布洛赫(Josh Bloch)的第三版的有效Java ,他写道:" ...
- JDK 11:Java序列化的终结开始了吗?
在博客文章" 将Google的协议缓冲区与Java结合使用 "中,我引用了乔什·布洛赫(Josh Bloch)的第三版的有效Java ,他写道:"没有理由在您编写的任何新 ...
- java jocky 下载,jocky1.0.3 (原joc) java混淆器 去除jdk版本限制
这是jocky1.0.3 (原joc) java混淆器 去除jdk版本限制下载,不支持现在的1.6.1.7等更高版本,现在我把某部分限制代码从class文件里面去除了,测试过可以用,更详细的说明在压缩 ...
- Java序列化机制——protoStuff
Java的序列化是在文件传输中必不可少的一部分.常用的Java序列化机制有Java默认的序列化机制,谷歌的protobuf等.而Java默认的序列化机制效率太低,protobuf要写protostuf ...
- java序列化机制之protoStuff
之前曾经写了两篇java的序列的机制,一种是默认的java序列化机制,这种方式效率太低.另外一种是谷歌的protobuf,但是这种我们还要写proto文件,并且我们还要使用工具来编译生成java文件, ...
- java protostuff 好处,java序列化Protostuff和Serializable的区别
java序列化Protostuff和Serializable的区别 关注:146 答案:1 mip版 解决时间 2021-01-25 06:11 提问者你若离去丶巴掌扇去 2021-01-24 0 ...
- Java序列化——JDK序列化与Json序列化
Java原生序列化 Java原生序列化我们可能会了解的比较多,Java类通过实现Serializable接口来实现该类对象的序列化,这个接口非常特殊,没有任何方法,只起标识作用.Java序列化保留了对 ...
最新文章
- lucene之创建索引代码
- 微信 for Mac 3.1.0 测试版发布(附安装包),新增「发朋友圈」功能
- ★LeetCode(39)——组合总和(JavaScript)
- win10安装ubuntu子系统,然后安装python3.6
- 应用安全-软件安全-漏洞CVE整理
- 使用代码辅助生成工具CodeSmith -- 生成NHibernate的映射文件
- WinForm BackgroundWorker笔记
- RAID环境中增加容量-在线扩容
- Android7.0 MessageQueue
- iOS屏幕旋转与锁屏
- 山景BP1048使用记录
- 【微信退款】Java实现微信APP退款和JSAPI退款流程
- Python 爬取优美图库图片
- 计算机组成原理 定点加法、减法 练习题
- Django入门(一)
- 模拟光源 html5,光照渲染——用canvas模拟光照效果
- 2017.08.10小结
- FM知名芯片商芯略总裁因侵权被警方拘留
- 51单片机中断与计时器
- Python 图像中颜色替换