无论是何种类型的数据,最终都需要转换成二进制流在网络上进行传输,那么在面向对象程序设计中,如何将一个定义好的对象传输到远端呢?数据的发送方需要将对象转换成为二进制流,才能在网络上进行传输,而数据的接收方则需要把二进制流再恢复为对象。

    将对象转换为二进制流的过程称为对象的序列化。

    将二进制流恢复为对象的过程称为对象的反序列化。

Hessian的效率比Java本身内置的序列化方式的效率要高很多。Java内置的序列化方式不需要引入第三方包,使用简单,在对效率要求不是很敏感的场景下,也未尝不是一个好的选择。而后面章节要介绍的XML和JSON格式,在互联网领域,尤其是现在流行的移动互联网领域,得益于其跨平台的特性,得到了极为广泛的应用。

    本节重点介绍Java内置的序列化方法和基于Java的Hessian序列化方法,并用代码演示具体实施方法。

    项目的目录结构如下:

使用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());
		
		
	}

}