无论是何种类型的数据,最终都需要转换成二进制流在网络上进行传输,那么在面向对象程序设计中,如何将一个定义好的对象传输到远端呢?数据的发送方需要将对象转换成为二进制流,才能在网络上进行传输,而数据的接收方则需要把二进制流再恢复为对象。
将对象转换为二进制流的过程称为对象的序列化。
将二进制流恢复为对象的过程称为对象的反序列化。
Hessian的效率比Java本身内置的序列化方式的效率要高很多。Java内置的序列化方式不需要引入第三方包,使用简单,在对效率要求不是很敏感的场景下,也未尝不是一个好的选择。而后面章节要介绍的XML和JSON格式,在互联网领域,尤其是现在流行的移动互联网领域,得益于其跨平台的特性,得到了极为广泛的应用。
本节重点介绍Java内置的序列化方法和基于Java的Hessian序列化方法,并用代码演示具体实施方法。
项目的目录结构如下:
以下是Java内置的序列化方式所实现的对象序列化和反序列化的关键代码:
package com.bjsxt.demo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class JavaSerializableDemo { public static void main(String[] args) throws IOException, ClassNotFoundException { Person zhansan = new Person(); zhansan.setName("高红程"); zhansan.setAge(23); //定义一个字节数组输出流 ByteArrayOutputStream os = new ByteArrayOutputStream(); //对象输出流 ObjectOutputStream out = new ObjectOutputStream(os); //将对象写入到字节数组输出,进行序列化 out.writeObject(zhansan); byte[] zhansanByte = os.toByteArray(); //字节数组输出流 ByteArrayInputStream is = new ByteArrayInputStream(zhansanByte); //执行反序列化,从流中读取对象 ObjectInputStream in = new ObjectInputStream(is); Person person = (Person)in.readObject(); System.out.println("姓名:"+ person.getName()); System.out.println("年龄:"+ person.getAge()); } }
通过java.io包下的ObjectOutputStream的writeObject方法,将Person类的实例zhansan序列化为字节数组,然后再通过ObjectInputStream的readObject方法将字节数组反序列化为person对象。
使用Hessian进行序列化,需要引入其提供的包hessian-4.0.37.jar。针对基于Java的Hessian序列化和反序列化的实现,代码如下:
package com.bjsxt.demo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import com.caucho.hessian.io.HessianInput; import com.caucho.hessian.io.HessianOutput; public class HessianDemo { public static void main(String[] args) throws IOException { Person zhansan = new Person(); zhansan.setName("高伟刚"); zhansan.setAge(22); ByteArrayOutputStream os = new ByteArrayOutputStream(); //Hessian的序列化输出 HessianOutput ho = new HessianOutput(os); ho.writeObject(zhansan); byte[] zhansanByte = os.toByteArray(); ByteArrayInputStream is = new ByteArrayInputStream(zhansanByte); //Hessian的反序列化读取对象 HessianInput hi = new HessianInput(is); Person person = (Person)hi.readObject(); System.out.println("姓名:"+ person.getName()); System.out.println("年龄:"+ person.getAge()); } }
相关推荐
【S25-Hessian反序列化1】是一个关于Java中Hessian序列化库的讨论,主要涉及Hessian与原生Java序列化的差异以及在Spring框架中的应用。Hessian是一种二进制序列化协议,旨在提高远程过程调用(RPC)的效率。与原生Java...
例如,服务器端可以使用Hessian序列化响应数据,客户端则通过反序列化接收到的二进制流来获取对象。这使得通信过程更为高效,尤其在数据量较大时,相比于文本格式,二进制格式能显著减少网络传输时间。 Hessian工具...
- 首先,Hessian序列化器会遍历Java对象的所有字段,对每个字段进行处理。 - 对于基本类型,如int、boolean、double等,Hessian有专门的编码方式,直接将其转换为字节。 - 对于复杂类型如对象和数组,Hessian会...
《Hessian 2.0序列化协议规范》 在分布式计算和网络通信中,数据的序列化和反序列化是至关重要的环节。Hessian 2.0是一种高效的二进制序列化协议,它旨在减少网络传输的数据量,提高数据交换的效率。本文将详细介绍...
总结,Hessian序列化规范是分布式系统中的重要工具,理解其原理和使用方法,能够帮助我们构建高效、可靠的跨网络通信方案。然而,任何工具都有其适用场景,选择最合适的序列化协议应根据项目需求和性能要求来决定。
- 目标服务器接收到数据后,使用 JRaft 的序列化框架进行反序列化操作。 - 如果恶意 Java 对象中包含了可执行代码,则会被执行,导致 RCE。 #### 五、修复建议 1. **更新版本**:升级到官方发布的最新稳定版本,...
那么,在什么情况下应该使用Java序列化,而什么情况下应该使用Hessian序列化?如果你需要序列化复杂对象,或者需要可靠和灵活的序列化机制,那么Java序列化是一个不错的选择。如果你需要高效的序列化机制,并且可以...
removal RCE、Hessian 反序列化、Yaml反序列化、密码解密、部分常用敏感路径(漏洞更新截止2024.9.12)
Hessian基于HTTP协议,通过序列化和反序列化Java对象,允许服务器端的方法被客户端直接调用,就像它们在同一台机器上运行一样。Hessian协议处理了类型转换和网络编码,使得跨平台通信变得简单,支持Java、C++、.NET...
Java 使用Hessian进行两台服务器资源之间同步是一个常见的分布式服务通信技术应用。Hessian是由Caucho公司开发的一种高效的二进制RPC(远程过程调用)协议,它能够使Java对象像本地方法一样在不同的服务器之间进行...
3. **数据序列化与反序列化**:Hessian协议负责处理数据的序列化和反序列化,使得Java对象可以被转换为二进制流在网络上传输,到达目的地后再还原为原来的对象。这大大简化了跨平台通信的数据处理过程。 4. **异常...
2. **简单类型支持**:Hessian支持基本的Java数据类型,如整型、浮点型、字符串、日期等,并且可以序列化和反序列化复杂对象。 3. **流式传输**:Hessian协议允许数据分块传输,这意味着服务端可以立即响应部分结果...
2. 处理结果:服务器执行完方法后,返回的数据会通过Hessian协议反序列化成对象,Android客户端可以直接使用。 五、错误处理与调试 1. 异常处理:在调用远程方法时,可能会出现网络异常或服务器异常,需要捕获并...
通过阅读这些类的源码,我们可以理解Hessian如何进行序列化和反序列化,以及如何处理网络通信。 4. **工具支持**: 配合IDE如IntelliJ IDEA或Eclipse,可以使用插件或者自定义的Maven/Gradle插件来简化Hessian服务...
7. **序列化框架**:默认使用Hessian进行序列化,其他选项包括Duddo、FastJson和Java自带的序列化机制。Hessian是一种二进制协议,具有轻量、快速的特点,适合在网络传输中使用。 8. **服务失效踢出**:基于...
4. **序列化框架**:默认使用 Hessian 进行序列化,还可以选择 Duddo、FastJson 或 Java 自带的序列化方式。Hessian 提供了二进制的高效序列化。 5. **服务提供者失效踢出机制**:基于 Zookeeper 的临时节点特性,...
- 在实际开发中,我们可能会需要编写一些辅助工具类来处理Hessian的相关操作,例如Hessian2Input和Hessian2Output,它们用于读写Hessian序列化的二进制流。 6. **安全性与优化**: - 虽然Hessian协议效率高,但其...