使用Hessian进行序列化

本文探讨了对象序列化和反序列化的重要性,对比了Java内置序列化和Hessian的效率。Java内置序列化简单但效率较低,适用于对效率要求不高的场景。Hessian序列化则提供更高的效率。文中通过代码示例展示了Java内置序列化和Hessian的具体使用方法,包括ObjectOutputStream的writeObject和ObjectInputStream的readObject,以及Hessian库的使用。

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

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

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

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

}

 

 

 

 

 

Hessian 中实现自定义序列化机制,主要涉及对 `Serializer` 和 `Deserializer` 接口的扩展,并通过 `ExtSerializerFactory` 来注册自定义的序列化和反序列化逻辑。这种方式允许开发者为特定类型提供定制化的序列化处理,以满足性能、兼容性或数据结构复杂性的需求。 ### 自定义序列化接口的实现 为了实现自定义序列化器,首先需要创建一个类实现 `com.caucho.hessian.io.Serializer` 接口,并重写其方法,例如 `writeObject` 和 `getSendJavaClass`。类似地,在反序列化端,需实现 `com.caucho.hessian.io.Deserializer` 接口,并重写如 `readObject` 方法[^1]。 ```java public class MyCustomSerializer implements Serializer { @Override public void writeObject(Object obj, AbstractHessianOutput out) throws IOException { // 实现自定义序列化逻辑 } @Override public Class<?> getObjectType() { return MyCustomType.class; } @Override public String getSendJavaClass() { return "MyCustomType"; } } ``` ```java public class MyCustomDeserializer implements Deserializer { @Override public Object readMap(AbstractHessianInput in) throws IOException { // 实现自定义反序列化逻辑 return new MyCustomType(); } @Override public Class<?> getType() { return MyCustomType.class; } } ``` ### 注册自定义序列化器 创建好自定义的序列化与反序列化类后,接下来需要使用 `ExtSerializerFactory` 将其注册到 Hessian序列化体系中。该过程包括实例化 `ExtSerializerFactory`,然后调用 `addSerializer` 和 `addDeserializer` 方法进行注册[^1]。 ```java ExtSerializerFactory extSerializerFactory = new ExtSerializerFactory(); extSerializerFactory.addSerializer(MyCustomType.class, new MyCustomSerializer()); extSerializerFactory.addDeserializer(MyCustomType.class, new MyCustomDeserializer()); // 将自定义工厂注册到全局序列化工厂 SerializerFactory serializerFactory = new SerializerFactory(); serializerFactory.addFactory(extSerializerFactory); ``` ### 配置 Hessian 使用自定义序列化器 完成上述步骤后,还需将配置好的 `SerializerFactory` 应用于 Hessian 的具体使用场景,例如在远程调用(Hessian RPC)中设置客户端或服务端使用序列化工厂。这通常通过配置 `HessianProxyFactory` 或服务端的 `Servlet` 实现。 ```java HessianProxyFactory factory = new HessianProxyFactory(); factory.setSerializerFactory(serializerFactory); MyService service = (MyService) factory.create(MyService.class, "http://example.com/hessian"); ``` 此外,若项目依赖于 Maven 管理,应确保引入了 Hessian 的依赖项,以便使用其提供的序列化接口和类[^2]: ```xml <dependency> <groupId>com.caucho</groupId> <artifactId>hessian</artifactId> <version>4.0.66</version> </dependency> ``` 通过以上步骤,即可成功实现并集成自定义的 Hessian 序列化机制,从而增强数据传输的灵活性和效率。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值