几种Java常用序列化框架的选型与对比

确诊白癜风 http://m.39.net/pf/a_5964818.html
一背景介绍序列化与反序列化是我们日常数据持久化和网络传输中经常使用的技术,但是目前各种序列化框架让人眼花缭乱,不清楚什么场景到底采用哪种序列化框架。本文会将业界开源的序列化框架进行对比测试,分别从通用性、易用性、可扩展性、性能和数据类型与Java语法支持五方面给出对比测试。

通用性:通用性是指序列化框架是否支持跨语言、跨平台。

易用性:易用性是指序列化框架是否便于使用、调试,会影响开发效率。

可扩展性:随着业务的发展,传输实体可能会发生变化,但是旧实体有可能还会被使用。这时候就需要考虑所选择的序列化框架是否具有良好的扩展性。

性能:序列化性能主要包括时间开销和空间开销。序列化的数据通常用于持久化或网络传输,所以其大小是一个重要的指标。而编解码时间同样是影响序列化协议选择的重要指标,因为如今的系统都在追求高性能。

Java数据类型和语法支持:不同序列化框架所能够支持的数据类型以及语法结构是不同的。这里我们要对Java的数据类型和语法特性进行测试,来看看不同序列化框架对Java数据类型和语法结构的支持度。

下面分别对JDKSerializable、FST、Kryo、Protobuf、Thrift、Hession和Avro进行对比测试。二序列化框架1JDKSerializableJDKSerializable是Java自带的序列化框架,我们只需要实现java.io.Serializable或java.io.Externalizable接口,就可以使用Java自带的序列化机制。实现序列化接口只是表示该类能够被序列化/反序列化,我们还需要借助I/O操作的ObjectInputStream和ObjectOutputStream对对象进行序列化和反序列化。下面是使用JDK序列化框架进行编解码的Demo:

/***编码*/publicstaticbyte[]encoder(Objectob)throwsException{//用于缓冲字节数字ByteArrayOutputStreambyteArrayOutputStream=newByteArrayOutputStream();//序列化对象ObjectOutputStreamobjectOutputStream=newObjectOutputStream(byteArrayOutputStream);objectOutputStream.writeObject(ob);byte[]result=byteArrayOutputStream.toByteArray();//关闭流objectOutputStream.close();byteArrayOutputStream.close();returnresult;}/***解码*/publicstaticTTdecoder(byte[]bytes)throwsException{ByteArrayInputStreambyteArrayInputStream=newByteArrayInputStream(bytes);ObjectInputStreamobjectInputStream=newObjectInputStream(byteArrayInputStream);Tobject=(T)objectInputStream.readObject();objectInputStream.close();byteArrayInputStream.close();returnobject;}通用性由于是Java内置序列化框架,所以本身是不支持跨语言序列化与反序列化。易用性作为Java内置序列化框架,无序引用任何外部依赖即可完成序列化任务。但是JDKSerializable在使用上相比开源框架难用许多,可以看到上面的编解码使用非常生硬,需要借助ByteArrayOutputStream和ByteArrayInputStream才可以完整字节的转换。可扩展性JDKSerializable中通过serialVersionUID控制序列化类的版本,如果序列化与反序列化版本不一致,则会抛出java.io.InvalidClassException异常信息,提示序列化与反序列化SUID不一致。

java.io.InvalidClassException:


转载请注明:http://www.xxcyfilter.com/zyjn/zyjn/12941.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了