Java序列化
一、 为什么要JAVA序列化
Java序列化机制是解决Java对象本身在网络中传输的问题的,所以序列化的重点是描述了类的内容,这个内容具体包括那些内容取决于使用的场景,不是越多越好,越详细越好,在技术的选型中往往最适合自己的才是最好,本文介绍常见的序列化方法。
有序列化当然有反序列化,序列化本身是一种编码和解码的过程。
二、常用的序列化方法
1. JDK自带的序列化方法
JDK中序列化的方法是通过让你的类实现Serializable接口来完成, 然后通过ObjectOutputStream和ObjectInputStream来写入和读出。
谈到JDK的序列化要注意序列化的serialVersionUID同时还有禁止字段序列化的关键字Transient。
真正使用的时候我们很少用到自带的的序列化方法,总结下来原因主要有两个。
1) 序列化中含有太多的信息,这些信息通常不会被使用,但是会带来效率和流量的额外开销。
2) 使用较为复杂,有比较多的约束和坑如ID问题,版本问题。
2. JSON序列化(格式化)
利用现有的JSON工具把java对象转换成json字符串,然后使用的时候再把字符串转换成java对象。XML也是属于对象与文本的方式,一些古老的系统还用着这类方法。
典型的json序列化,包括但不局限与jackson,fastjson,gson,jsonp等。
3. 二进制序列化
随着系统的复杂度提高,系统通信变得越来越复杂,对性能越来越高,虽然json序列化性能不错,但是字符串的开销还是会比直接存二进制的开销大很多,所以就出现了很多二进制的序列化方案。
如dubble 默认的 hessian2,kryo, fst。
4. 中间件自己的序列化方案
尽管序列化技术越来越成熟了,但是很多中间件仍然选择自己的序列化方案,如消息系统kafka 等。
三、性能对比
下表是网络上找的集中序列化方法的对比,可以简单了解下,但是不能作为具体的技术选型的依据,因为对比没有时间版本的维度,没有具体场景所以真正选择的时候还需要自己做一些实验。
Kryo | 272 | 90 |
FST | 288 | 96 |
Dubbo Serialization | 430 | 186 |
Hessian | 546 | 329 |
FastJson | 461 | 218 |
Json | 657 | 409 |
Java Serialization | 963 | 630 |
上一篇: 直观解释矩阵的特征值与特征向量
下一篇: SerializeUtil工具类