【序列化和反序列化】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序列化使用说明

  1. 序列化对象要实现Serializable接口,否则序列化时会报must implement java.io.Serializable异常
  2. 序列化对象不需要添加serialVersionUID,即使有serialVersionUID,修改了serialVersionUID也不影响反序列化
  3. hessian会把复杂对象所有属性存储在一个 Map 中进行序列化。所以在父类、子类存在同名成员变量的情况下, Hessian 序列化时,先序列化子类,然后序列化父类,因此反序列化结果会导致子类同名成员变量被父类的值覆盖

 

posted @ 2022-12-14 15:48  harara  阅读(651)  评论(0编辑  收藏  举报