无论是何种类型的数据,最终都需要转换成二进制流在网络上进行传输,那么在面向对象程序设计中,如何将一个定义好的对象传输到远端呢?数据的发送方需要将对象转换成为二进制流,才能在网络上进行传输,而数据的接收方则需要把二进制流再恢复为对象。
将对象转换为二进制流的过程称为对象的序列化。
将二进制流恢复为对象的过程称为对象的反序列化。
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序列化和反序列化的实现,代码如下:
扫描二维码关注公众号,回复:
268856 查看本文章
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()); } }