java序列化-hessian

445 阅读1分钟

直接看代码

工具类

序列化工具类

package java1.serialize.hessian;


import com.caucho.hessian.io.Hessian2Input;
import com.caucho.hessian.io.Hessian2Output;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import lombok.Cleanup;
import lombok.extern.slf4j.Slf4j;


/**
 * 基于hessian2
 * 
 * 参考:https://juejin.cn/post/7051541832324349965#heading-3
 * 
 * @author javaself
 */
@Slf4j
public class HessianUtil {


  /**
   * JavaBean序列化.
   *
   * @param javaBean Java对象.
   * @throws Exception 异常信息.
   */
  public static <T> byte[] serialize(T javaBean) {
    try {
      @Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();
      @Cleanup Hessian2Output ho = new Hessian2Output(baos);
      ho.writeObject(javaBean);
      ho.flush();
//      log.info("字节数量:{}"undefinedbaos.toByteArray()); //字节数量:75
      return baos.toByteArray();
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }


  /**
   * JavaBean反序列化.
   *
   * @param serializeData 序列化数据.
   * @throws Exception 异常信息.
   */
  public static <T> T deserialize(byte[] serializeData) {
    try {
      @Cleanup ByteArrayInputStream bais = new ByteArrayInputStream(serializeData);
      @Cleanup Hessian2Input hi = new Hessian2Input(bais);
      return (T) hi.readObject();
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }


}

测试类

package java1.serialize.hessian;


import java1.serialize.Person;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;


@Slf4j
class HessianUtilTest {


  @Test
  void serialize() {
    long start = System.currentTimeMillis();


    for (int i = 0; i < 10000; i++) {
      Person person = new Person("javaself"undefined 22undefined "上海");
      byte[] bytes = HessianUtil.serialize(person);
      HessianUtil.deserialize(bytes);
    }


    long end = System.currentTimeMillis();
    log.info("耗时:{}ms"undefinedend-start); //循环10000次,耗时:110ms
  }


  @Test
  void deserialize() {
  }
}

性能指标

字节数量

序列化之后的内容的字节数量:75

log.info("字节数量:{}"undefinedbaos.toByteArray()); //字节数量:75

比fastjon多一点,fastjon是:47

log.info("字节长度:{}"undefined bytes.length); //47

耗时

耗时是:110ms

log.info("耗时:{}ms"undefinedend-start); //循环10000次,耗时:110ms

比fastjson快一点,fastjson是:162ms

log.info("耗时:{}ms"undefinedend-start); //循环10000次,耗时:162ms

序列化之后的内容,长什么样子?

长这个样子

特点
1.比json的内容多一点,所以字节数量比json更多一点。
2.人不可读。

结论

hessian比fastjson的字节数量要多一点,但是速度要快一点。

为什么?

不是说,一般情况下,字节数量更少,速度更快吗?

因为fastjson是基于反射,即底层原理是基于反射,反射一般比较慢。

所以,fastjson,虽然字节数量更少一点,但是速度更慢一点。

hessian版本

现在主要是用hessian2,因为hessian1的速度比fastjson还要慢。

下面的代码是基于hessian1的demo。


代码

工具类

package java1.serialize.hessian;


import com.caucho.hessian.io.HessianInput;
import com.caucho.hessian.io.HessianOutput;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java1.serialize.FileUtils;
import java1.serialize.Person;
import lombok.extern.slf4j.Slf4j;


/**
 * 基于hessian1
 * 
 * 参考:https://segmentfault.com/a/1190000040965669/en
 *
 * @author javaself
 */
@Slf4j
public class HessianSerializer {
  public static void main(String[] args) throws IOException {
//    User user=new User();
//    user.setName("Mic");
//    user.setAge(18);


    Person person = new Person("javaself"undefined 22undefined "上海");


    byte[] bytes=serializer(person);
    byte[] bytes2=serializerToFile(person);
    System.out.println("序列化完成");


    Person nuser=deserializer(bytes);
    System.out.println(nuser);
  }


  public static byte[] serializer(Person user) throws IOException {
    ByteArrayOutputStream bos=new ByteArrayOutputStream(); //表示输出到内存的实现
    HessianOutput ho=new HessianOutput(bos);
    ho.writeObject(user);
    byte[] bytes = bos.toByteArray();
//    log.info("字节数量:{}"undefined bytes.length); //字节数量:75
    return bytes;
  }


  public static byte[] serializerToFile(Person user) throws IOException {
    File file = new File("Person-hessian.txt");
//    ByteArrayOutputStream bos=new ByteArrayOutputStream(); //表示输出到内存的实现
    HessianOutput ho=new HessianOutput(new FileOutputStream(file));
    ho.writeObject(user);
//    byte[] bytes = bos.toByteArray();
//    log.info("字节数量:{}"undefined bytes.length);
    return FileUtils.toByteArray("Person-hessian.txt");
  }


  public static Person deserializer(byte[] data) throws IOException {
    ByteArrayInputStream bis=new ByteArrayInputStream(data);
    HessianInput hi=new HessianInput(bis);
    return (Person)hi.readObject();
  }
}

测试类

package java1.serialize.hessian;


import java.io.IOException;
import java1.serialize.Person;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;


/**
 * 基于hessian1
 *
 * @author javaself
 */
@Slf4j
class HessianSerializerTest {


  @Test
  void serializer() throws IOException {
    long start = System.currentTimeMillis();


    for (int i = 0; i < 10000; i++) {
      Person person = new Person("javaself"undefined 22undefined "上海");
      byte[] bytes = HessianSerializer.serializer(person);
      HessianSerializer.deserializer(bytes);
    }


    long end = System.currentTimeMillis();
    log.info("耗时:{}ms"undefinedend-start); //循环10000次,耗时:205ms。和fastjson差不多,甚至测试结果比fastjson更慢一点。
  }


  @Test
  void serializerToFile() {
  }


  @Test
  void deserializer() {
  }
}

是否跨语言?

除了java序列化,其他都是跨语言。

包括,json和hessian等。

是否人可读?

json是人可读,因为其实就是json格式的字符串。

java序列化和hessian,都是人不可读。

参考

juejin.cn/post/713591…