首页 > 编程语言 >【java开发】Hessian序列化

【java开发】Hessian序列化

时间:2024-10-09 15:13:36浏览次数:7  
标签:ZhuZi java 字节 JDK zhuZi 序列化 Hessian

除开前面提到的几种序列化方案外,相信看过Dubbo框架源码的小伙伴,一定还知道一种方案,即基于二进制实现Hessian,这是Dubbo中默认的序列化机制,用于服务提供者与消费者之间进行数据传输,这里咱们也简单过一下。

Hessian和JDK原生的序列化技术,兼容度很高,相较于使用ProtoBuf而言,成本要低许多,首先导入一下依赖包:

<dependency>
    <groupId>com.caucho</groupId>
    <artifactId>hessian</artifactId>
    <version>4.0.65</version>
</dependency>

接着依旧基于最开始的ZhuZi实体类,来写一下测试代码:

public classHessianDemo{
publicstaticvoidmain(String[] args)throwsException{
// 1. 序列化
ZhuZizhuZi=newZhuZi(1,"黄金竹子","A级");
byte[] serializeBytes = serialize(zhuZi);
System.out.println("Hessian序列化后字节数组长度:"+ serializeBytes.length);

// 2. 反序列化
ZhuZideserializeZhuZi= deserialize(serializeBytes);
System.out.println(deserializeZhuZi.toString());
}

/**
     * 序列化方法
     * @param zhuZi 需要序列化的对象
     * @return 序列化后生成的字节流
     */
privatestaticbyte[] serialize(ZhuZi zhuZi)throwsIOException{
ByteArrayOutputStreambos=newByteArrayOutputStream();
Hessian2Outputh2o=newHessian2Output(bos);
        h2o.writeObject(zhuZi);
        h2o.close();
return bos.toByteArray();
}

/**
     * 反序列化方法
     * @param bytes 字节序列(字节流)
     * @return 实体类对象
     */
privatestaticZhuZideserialize(byte[] bytes)throwsException{
ByteArrayInputStreambis=newByteArrayInputStream(bytes);
Hessian2Inputh2i=newHessian2Input(bis);
ZhuZizhuZi=(ZhuZi) h2i.readObject();
        h2i.close();
return zhuZi;
}
}

上述代码对比最开始的JDK序列化方案,几乎一模一样,只是将输出/输入流对象,从ObjectOutputStream、ObjectInputStream换成了Hessian2Output、Hessian2Input,此时来看结果对比,如下:

JDK序列化后的字节数组长度:224
ZhuZi(id=1, name=黄金竹子, grade=A级)
=============================================
Hessian序列化后字节数组长度:70
ZhuZi(id=1, name=黄金竹子, grade=A级)

是不是特别惊讶?
其余任何地方没有改变,仅用Hessian2替换掉JDK原生的IO流对象,结果码流体积竟然缩小了3.2倍!
并且还完全保留了JDK序列化技术的特性,还支持多语言异构……,所以,这也是Dubbo使用Hessian2作为默认序列化技术的原因,不过Dubbo使用的是定制版,依赖如下:

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-serialization-hessian2</artifactId>
    <version>3.2.0-beta.6</version>
</dependency>

感兴趣的可以去看看DecodeableRpcInvocation#decode()、encode()这个两个方法,其中涉及到数据的编解码工作,默认采用Hessian2序列化技术~

标签:ZhuZi,java,字节,JDK,zhuZi,序列化,Hessian
From: https://www.cnblogs.com/o-O-oO/p/18394914

相关文章

  • C# 类型增加自定义xml序列化
    1、首先类需要增加[Serializable]标识2、类实现IXmlSerializable接口下面是重写ReadXml和WriteXml方法publicvoidReadXml(XmlReaderreader){reader.ReadStartElement(reader.LocalName);while(reader.Read()){if(reader.Name=="TimeType"&&......
  • 【javascript 编程】Web前端之JavaScript动态添加类名的两种方法、区别、className、c
    通过className来添加或删除类名添加类名获取元素el.className="类名1类名2...";多个类名用空格隔开。移除类名获取元素名el.className="";直接等于一个空字符串即可删除类名。通过classList来添加或删除类名添加一个类名获取元素名el.classList.add("类名");。......
  • [Javascript] Using Proxy to observe the object
    constobj={a:1,b:2,c:{d:1,e:2,},};functionisObject(val){returnval!==null&&typeofval==="object";}functionobserve(obj){constproxy=newProxy(obj,{get(target,key){constv......
  • java计算机毕业设计后勤食材防疫管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着社会的快速发展和人们生活水平的提高,食品安全问题日益受到广泛关注。尤其是在后勤管理中,食材的安全与卫生直接关系到人们的健康与生命安全。然而......
  • java计算机毕业设计大学生心理健康咨询管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着社会的快速发展和竞争的日益激烈,大学生面临着前所未有的心理压力和挑战。学业负担、就业压力、人际关系等多重因素交织在一起,使得大学生的心理健......
  • java+vue计算机毕设 在线学习与考试系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和普及,教育领域正经历着前所未有的变革。在线学习作为一种新兴的教育模式,以其便捷性、灵活性和跨越时空限制的特点,逐渐成为......
  • java+vue计算机毕设高校机房管理系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,高校机房作为教学和科研的重要场所,其管理效率与服务质量直接影响到师生的使用体验与教学效果。传统的人工管理方式存在诸多弊......
  • java+vue计算机毕设高校二手市场系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育的普及和高校规模的扩大,大学生群体对各类学习资料、生活用品的需求日益增长。然而,在资源分配上,往往存在新生入学时大量购置物品,而毕业生......
  • 【 java 安全】Java对象都是堆上分配?看完Java中对象逃逸分析就知道答案了
    原创龙虾编程随着JIT编译期的发展与逃逸分析技术逐渐成熟,所有的对象都分配到堆上也渐渐变得不是一定的。在编译期间JIT会对代码做很多优化,其中有一部分优化是减少内存堆分配压力,这里有一种重要的技术叫逃逸分析。逃逸分析是一种可以有效减少Java程序中同步负载和内存堆分配压......
  • java+vue计算机毕设扶贫产品网上订销系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和互联网的普及,电子商务已成为推动社会经济发展的重要力量。在扶贫工作中,传统的销售模式往往受限于地域、信息不畅等因素,导致......