通用性:通用性是指序列化框架是否支持跨语言、跨平台。
易用性:易用性是指序列化框架是否便于使用、调试,会影响开发效率。
可扩展性:随着业务的发展,传输实体可能会发生变化,但是旧实体有可能还会被使用。这时候就需要考虑所选择的序列化框架是否具有良好的扩展性。
性能:序列化性能主要包括时间开销和空间开销。序列化的数据通常用于持久化或网络传输,所以其大小是一个重要的指标。而编解码时间同样是影响序列化协议选择的重要指标,因为如今的系统都在追求高性能。
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: