Top

Java序列化工具,JVM Serializable,Java项目中常用序列化工具,kryo,protostuff,fst


Java对象序列化是Java的一个主要重要的核心特性,自带的对象序列化处理,大家在学习Java核心时都学过,如下:

/**

 * 序列化对象

 * @param obj

 * @return 对象需实现Serializable接口

 */

public static byte[] onSerialize(Object obj) {

   ObjectOutputStream oos = null;

   ByteArrayOutputStream byteOut = null;

   try {

      byteOut = new ByteArrayOutputStream();

      oos = new ObjectOutputStream(byteOut);

      oos.writeObject(obj);

      byte[] bytes = byteOut.toByteArray();

      return bytes;

   } catch (Exception e) {

   }

   return null;

}

/**

 * 反序列化对象

 *

 * @param bytes

 * @return 对象需实现Serializable接口

 */

public static Object unSerialize(byte[] bytes) {

   ByteArrayInputStream bais = null;

   try {

      // 反序列化

      bais = new ByteArrayInputStream(bytes);

      ObjectInputStream ois = new ObjectInputStream(bais);

      return ois.readObject();

   } catch (Exception e) {

   }

   return null;

}


这种运用,可能是一些项目的常见运用,一些项目都没什么问题,但是当高并发常见时,这种序列化效率就太低,不能忍受!

其实早在Github中,就有一个项目,测试业内第三方Java序列化工具jvm-serializers 


下面列举一些高并发项目中常用的序列化工具:


一、json/xml系列,目前使用比较频繁的格式化数据工具,简单直观,可读性好,有jackson,gson,fastjson等等,据说现在已经效率比java原生的序列化快3到5倍:

<dependency>

   <groupId>com.fasterxml.jackson.core</groupId>

   <artifactId>jackson-core</artifactId>

   <version>2.9.8</version>

</dependency>

<dependency>

   <groupId>com.fasterxml.jackson.core</groupId>

   <artifactId>jackson-annotations</artifactId>

   <version>2.9.8</version>

</dependency>

<dependency>

   <groupId>com.fasterxml.jackson.core</groupId>

   <artifactId>jackson-databind</artifactId>

   <version>2.9.8</version>

</dependency>

<dependency>

   <groupId>com.fasterxml.jackson.jaxrs</groupId>

   <artifactId>jackson-jaxrs-json-provider</artifactId>

   <version>2.9.8</version>

</dependency>

<dependency>

   <groupId>com.fasterxml.jackson.datatype</groupId>

   <artifactId>jackson-datatype-jsr310</artifactId>

   <version>2.9.8</version>

</dependency>

<dependency>

   <groupId>com.google.code.gson</groupId>

   <artifactId>gson</artifactId>

   <version>2.8.5</version>

</dependency>

<dependency>

   <groupId>com.alibaba</groupId>

   <artifactId>fastjson</artifactId>

   <version>1.2.56</version>

</dependency>


二、kryo,kryo是一个高性能的序列化/反序列化工具,由于其变长存储特性并使用了字节码生成机制,拥有较高的运行速度较小的体积,效率比java高出一个级别,序列化出来的结果,是其自定义的、独有的一种格式,体积更小,一般只用来进行序列化和反序列化,而不用于在多个系统、甚至多种语言间进行数据交换(目前 kryo 也只有 java 实现),目前已经有多家大公司使用,相对比较稳定。

官方文档:

中文:https://blog.csdn.net/fanjunjaden/article/details/72823866

英文:https://github.com/EsotericSoftware/kryo

<dependency>

    <groupId>com.esotericsoftware</groupId>

    <artifactId>kryo</artifactId>

    <version>4.0.2</version>

</dependency>

<dependency>

    <groupId>com.esotericsoftware</groupId>

    <artifactId>kryo-shaded</artifactId>

    <version>4.0.2</version>

</dependency>


三、fst,FST fast-serialization 是重新实现的 Java 快速对象序列化的开发包。序列化速度更快(2-10倍)、体积更小,而且兼容 JDK 原生的序列化。要求 JDK 1.7 支持。与kryo类似是apache组织的一个开源项目,完全兼容JDK序列化协议的系列化框架。

官方文档:

https://github.com/RuedigerMoeller/fast-serialization/wiki/Serialization 

<dependency>

   <groupId>de.ruedigermoeller</groupId>

   <artifactId>fst</artifactId>

   <version>2.57</version>

</dependency>


四、protostuff,是google基于protobuf开发的优化产品。使用起来也比较简单易用,目前效率也是最好的一种序列化工具。

protobuf是什么 protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。

<dependency>

   <groupId>io.protostuff</groupId>

   <artifactId>protostuff-core</artifactId>

   <version>1.6.0</version>

</dependency>

<dependency>

   <groupId>io.protostuff</groupId>

   <artifactId>protostuff-runtime</artifactId>

   <version>1.6.0</version>

</dependency>

<dependency>

   <groupId>io.protostuff</groupId>

   <artifactId>protostuff-core</artifactId>

   <version>1.5.9</version>

</dependency>

<dependency>

   <groupId>io.protostuff</groupId>

   <artifactId>protostuff-runtime</artifactId>

   <version>1.5.9</version>

</dependency>