6种Java序列化框架

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 下面介绍几种常用的Java序列化技术,耗时比较,单位纳秒0.002511:com.my.tools.

下面介绍几种常用的Java序列化技术,耗时比较,单位纳秒

0.002511:com.my.tools.serialize.KryoRegisterSerialize

0.007207:com.my.tools.serialize.FSTSerialize

0.00811:com.my.tools.serialize.KryoSerialize

0.010137:com.my.tools.serialize.GsonSerialize

0.012367:com.my.tools.serialize.FastjsonSerialize

0.021474:com.my.tools.serialize.JDKSerialize


1.JDKSerialize

方法一:若Student类仅仅实现了Serializable接口;

方法二:若Student类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out);

方法三:若Student类实现了Externalnalizable接口,且Student类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,

[java]  view plain  copy
  1. public static byte[] serialize(Object obj) {try {ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(obj);byte[] bs = baos.toByteArray();baos.close();oos.close();return bs;} catch (IOException e) {throw new RuntimeException(e);}}public static Object deserialize(byte[] bits) {try {ByteArrayInputStream bais = new ByteArrayInputStream(bits);ObjectInputStream ois = new ObjectInputStream(bais);Object obj = ois.readObject();bais.close();ois.close();return obj;} catch (Exception e) {throw new RuntimeException(e);}}  

2.FastjsonSerialize

一个JSON库涉及的最基本功能就是序列化和反序列化。Fastjson支持java bean的直接序列化。 使用com.alibaba.fastjson.JSON这个类进行序列化和反序列化。 

[java]  view plain  copy
  1. public static String serialize(Object obj){String json = JSON.toJSONString(obj);return json;}public static Object deserialize(String json, Class<?> clazz){Object obj = JSON.parseObject(json, clazz);return obj;}  

3.FSTSerialize

FST fast-serialization 是重新实现的 Java 快速对象序列化的开发包。序列化速度更快(2-10倍)、体积更小,而且兼容 JDK 原生的序列化。

要求 JDK 1.7 支持。

Java 快速序列化库 FST 已经发布了 2.0 版本,该版本的包名已经更改,无法平滑升级。另外官方建议为了稳定性考虑还是使用最新的 1.58 版本为好

[java]  view plain  copy
  1. static FSTConfiguration configuration = FSTConfiguration   .createDefaultConfiguration(); public static byte[] serialize(Object obj){ return configuration.asByteArray((Serializable)obj);}public static Object deserialize(byte[] sec){return configuration.asObject(sec);}  

4.GsonSerialize

这里采用JSON格式同时使用采用Google的gson-2.2.4.jar 进行转义.

[java]  view plain  copy
  1. static Gson gson = new Gson();public static String serialize(Object obj){String json = gson.toJson(obj);return json;}public static Object deserialize(String json, Class<?> clazz){Object obj = gson.fromJson(json, clazz);return obj;}  

5.JacksonSerialize

Jackson库(http://jackson.codehaus.org),是基于java语言的开源json格式解析工具,整个库(使用最新的2.2版本)包含3个jar包:

jackson-core.jar——核心包(必须),提供基于“流模式”解析的API。

jackson-databind——数据绑定包(可选),提供基于“对象绑定”和“树模型”相关API。

jackson-annotations——注解包(可选),提供注解功能。

Jackson的优势:

相对于java json解析的其他库,诸如json-lib、gson包,Jackson具有以下优点:

功能全面,提供多种模式的json解析方式,“对象绑定”使用方便,利用注解包能为我们开发提供很多便利。

性能较高,“流模式”的解析效率超过绝大多数类似的json包。

核心包:JsonPaser(json流读取),JsonGenerator(json流输出)。

数据绑定包:ObjectMapper(构建树模式和对象绑定模式),JsonNode(树节点)

[java]  view plain  copy
  1. public static String serialize(Object obj){ObjectMapper mapper = new ObjectMapper();String json = null;try {json = mapper.writeValueAsString(obj);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return json;}public static Object deserialize(String json, Class<?> clazz){ObjectMapper mapper = new ObjectMapper();Object obj = null;try {obj = mapper.readValue(json, clazz);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} return obj;}  

6.KryoSerialize 和 KryoRegisterSerialize

Kryo的运行速度是java Serializable 的20倍左右  

Kryo的文件大小是java Serializable的一半左右

Kryo有两种模式:

一种是先注册(regist),再写对象,即writeObject函数,实际上如果不先注册,在写对象时也会注册,并为class分配一个id。

注意,如果是rpc,则必须两端都按同样的顺序注册,否则会出错,因为必须要明确类对应的唯一id。

另一种是写类名及对象,即writeClassAndObject函数。

writeClassAndObject函数是先写入(-1 + 2)(一个约定的数字),再写入类ID(第一次要先写-1,再写类ID + 类名),写入引用关系(见引用的实现),最后才写真正的数据)。

注意每一次writeClassAndObject调用后信息都会清空,所以不用担心和client交互时会出错。

[java]  view plain  copy
  1. static Kryo kryo = new Kryo();public static byte[] serialize(Object obj) {byte[] buffer = new byte[2048];Output output = new Output(buffer);kryo.writeClassAndObject(output, obj);byte[] bs = output.toBytes();output.close();return bs;}public static Object deserialize(byte[] src) {Input input = new Input(src);Object obj = kryo.readClassAndObject(input);input.close();return obj;}  
[java]  view plain  copy
  1. static Kryo kryo = null;static{kryo = new Kryo();kryo.setReferences(false);kryo.setRegistrationRequired(false);kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());}public static byte[] serialize(Object obj) {kryo.register(obj.getClass());byte[] buffer = new byte[2048];Output output = new Output(buffer);kryo.writeObject(output, obj);byte[] bs = output.toBytes();output.close();return bs;}public static Object deserialize(byte[] src, Class<?> clazz) {kryo.register(clazz);Input input = new Input(src);Object obj = kryo.readObject(input, clazz);input.close();return obj;}  



Json的优点:明文结构一目了然,可以跨语言,属性的增加减少对解析端影响较小。缺点:字节数过多,依赖于不同的第三方类库。


Object Serializalbe 优点:java原生支持,不需要提供第三方的类库,使用比较简单。缺点:无法跨语言,字节数占用比较大,某些情况下对于对象属性的变化比较敏感。

对象在进行序列化和反序列化的时候,必须实现Serializable接口,但并不强制声明唯一的serialVersionUID,是否声明serialVersionUID对于对象序列化的向上向下的兼容性有很大的影响。


我们通常以为将Java对象序列化成二进制比序列化成XML或Json更快,其实是错误的,如果你关心性能,建议避免Java序列化。

相关文章
|
22天前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
22天前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
1月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
123 3
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
44 3
|
17天前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
29 4
|
1月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
1月前
|
消息中间件 Java 数据库连接
Java 反射最全详解 ,框架设计必掌握!
本文详细解析Java反射机制,包括反射的概念、用途、实现原理及应用场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Java 反射最全详解 ,框架设计必掌握!
|
27天前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
38 2
|
28天前
|
前端开发 Java 数据库连接
你不可不知道的JAVA EE 框架有哪些?
本文介绍了框架的基本概念及其在编程领域的应用,强调了软件框架作为通用、可复用的软件环境的重要性。文章分析了早期Java EE开发中使用JSP+Servlet技术的弊端,包括可维护性差和代码重用性低等问题,并阐述了使用框架的优势,如提高开发效率、增强代码规范性和可维护性及提升软件性能。最后,文中详细描述了几种主流的Java EE框架,包括Spring、Spring MVC、MyBatis、Hibernate和Struts 2,这些框架通过提供强大的功能和支持,显著提升了Java EE应用的开发效率和稳定性。
51 1
|
2月前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
74 1
Spring 框架:Java 开发者的春天