【序列化和反序列化】Hessian
1、hession序列化实现机制
hession的实现机制着重于数据,附带简单的类型信息,就像Integer=1,hession会序列化成I 1这样的流,I表示int or Integer ,1就是数据内容。而对于复杂对象,通过Java的反射机制,hession把对象所有的属性当成一个Map来序列化,产生类似M className propertyName I intValue propertyName S stringvalue这样的流,包含了基本的类型描述和数据内容。而在序列化过程中,如果一个对象之前出现过,hession会直接插入一个R index 这样的块来表示一个引用位置,从而省去再次序列化和反序列化的时间。这样这样做的代价就是hessian需要对不同的类型进行不同的处理(因此hessian直接偷懒不支持short),而且同时因为并没有深入到实现内部去进行序列化,所以在某些场合会发生一定的不一致,比如通过Collections.synchronizedMap得到的map
官方文档:http://hessian.caucho.com/doc/hessian-serialization.html
2、hession使用示例
依赖
<dependency> <groupId>com.caucho</groupId> <artifactId>hessian</artifactId> <version>4.0.65</version> </dependency>
代码示例
package com.chenly.serialize.hessian; import com.caucho.hessian.io.Hessian2Input; import com.caucho.hessian.io.Hessian2Output; import com.chenly.serialize.bean.Score; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; /** * @author: chenly * @date: 2022-11-28 15:22 * @description: * @version: 1.0 */ public class HessianTest { public static void main(String[] args) throws Exception { Score object = Score.builder() .className("一班") .stuName("张三").course("生物").score(90).build(); long startTime = System.currentTimeMillis(); //序列化 ByteArrayOutputStream os = new ByteArrayOutputStream(); Hessian2Output output = new Hessian2Output(os); output.writeObject(object); output.close(); byte[] bytes = os.toByteArray(); //反序列化 ByteArrayInputStream in = new ByteArrayInputStream(bytes); Hessian2Input input = new Hessian2Input(in); System.out.println(input.readObject()); input.close(); System.out.println("耗时:"+(System.currentTimeMillis()-startTime)/1000.00); } }
3、hession序列化使用说明
- 序列化对象要实现Serializable接口,否则序列化时会报must implement java.io.Serializable异常
- 序列化对象不需要添加serialVersionUID,即使有serialVersionUID,修改了serialVersionUID也不影响反序列化
- hessian会把复杂对象所有属性存储在一个 Map 中进行序列化。所以在父类、子类存在同名成员变量的情况下, Hessian 序列化时,先序列化子类,然后序列化父类,因此反序列化结果会导致子类同名成员变量被父类的值覆盖
作者:小念
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。