Hessian源码学习(三)序列化概述

今天我们重点来看看Hessian是如何实现序列化的(这些序列化类可以脱离hessian源码包,单独拿出来使用),参考源码版本为3.0.13

首先我们看下序列化一个对象的代码:

// 这里可以是任何形式的OutputStream,现以FileOutputStream为例
OutputStream os = new FileOutputStream("hessianOutput");
// 创建 HessianOutput对象
AbstractHessianOutput out = new HessianOutput(os);
// 设置序列化工厂(其实上一步初始化已经默认带你设置了SerializerFactory)
out.setSerializerFactory(new SerializerFactory());
// 序列化 obj对象(obj可以是一个简单对象比如Integer,String,数组,枚举,集合也可以是一个自定义类)
out.writeObject(new Integer(10));

我们看一下序列化后的结果:

[img]http://dl.iteye.com/upload/attachment/0072/8713/3f36cbfd-9150-3480-8372-30640a0a31ca.jpg[/img]

现在我们来逐步分析下上面这段代码:

[b][size=medium]1.out.setSerializerFactory(new SerializerFactory());[/size][/b]

首先SerializerFactory是什么?顾名思义 SerializerFactory是一个序列化工厂,里面包含了序列化(反序列化)各种对象的Serializer(DeSerializer)类,我们看下在创建SerializerFactory时,它做了写什么:(为了表达方面的方便,我这里只说序列化)

// 静态代码快(初始化SerializerFactory)
static {

// 创建序列化和反序列化map,至于其中的Key-Value 我想大家也能猜到,key就是某个需要序列化的class,value就是序列化该class 对应的Serializer类

_serializerMap = new HashMap();
_deserializerMap = new HashMap();
_typeMap = new HashMap();

// 初始化序列化和反序列化map (对于“简单类型”都使用BasicSerializer作为它的序列化类)
addBasic(void.class, "void", BasicSerializer.NULL); //基本类型
addBasic(Boolean.class, "boolean", BasicSerializer.BOOLEAN);
addBasic(Byte.class, "byte", BasicSerializer.BYTE);
// 省略类似代码...

addBasic(boolean.class, "boolean", BasicSerializer.BOOLEAN); //基本对象类型
addBasic(byte.class, "byte", BasicSerializer.BYTE);
// 省略类似代码...

addBasic(boolean[].class, "[boolean", BasicSerializer.BOOLEAN_ARRAY); //基本数组类型
addBasic(byte[].class, "[byte", BasicSerializer.BYTE_ARRAY);
addBasic(short[].class, "[short", BasicSerializer.SHORT_ARRAY);
// 省略类似代码...

_serializerMap.put(Class.class, new ClassSerializer());
_deserializerMap.put(Class.class, new ClassDeserializer());

_deserializerMap.put(Number.class, new BasicDeserializer(BasicSerializer.NUMBER));

_serializerMap.put(BigDecimal.class, new StringValueSerializer());
try {
_deserializerMap.put(BigDecimal.class,
new StringValueDeserializer(BigDecimal.class));
} catch (Throwable e) {
}

// 后面代码省略,内容基本同上
}

上面代码中 addBasic()方法做了写什么呢?

addBasic()做的很简单,以addBasic(Integer.class, "int",BasicSerializer.INTEGER)为例子:

实际上就是_serializerMap.put(Integer.class, new BasicSerializer(BasicSerializer.INTEGER));

private static void addBasic(Class cl, String typeName, int type)
{
// 放入key-value
_serializerMap.put(cl, new BasicSerializer(type));

Deserializer deserializer = new BasicDeserializer(type);
_deserializerMap.put(cl, deserializer);
_typeMap.put(typeName, deserializer);
}

[b][size=medium]2.out.writeObject(obj);[/size][/b]

HessianOutput 继承 AbstractHessianOutput 且 writeObject是 父类中的一个抽象方法,我们看下在HessianOutput中 writeObject做了写什么:

public void writeObject(Object object)
throws IOException
{
if (object == null) {
writeNull();
return;
}

Serializer serializer;
//从序列化工厂得到能够序列化该对象的序列化类
serializer = _serializerFactory.getSerializer(object.getClass());
//使用具体的序列化类序列化对象
serializer.writeObject(object, this);
}

我们看下 _serializerFactory.getSerializer(object.getClass());的实现

public Serializer getSerializer(Class cl)
throws HessianProtocolException
{
Serializer serializer;

// 如果是简单类型,那么直接就能获取到(备注:这里能够取到的都是之前在SerializerFactory的static静态代码块中初始化的那些key)
serializer = (Serializer) _serializerMap.get(cl);
if (serializer != null)
return serializer;

// 从缓存中取 (为什么这里有个缓存的东西,看后面代码就立刻明了)
if (_cachedSerializerMap != null) {
serializer = (Serializer) _cachedSerializerMap.get(cl);

if (serializer != null)
return serializer;
}

// 省略部分代码....

// 获取其他类型的序列化类
if (serializer != null) {
}

else if (HessianRemoteObject.class.isAssignableFrom(cl))
serializer = new RemoteSerializer();

else if (BurlapRemoteObject.class.isAssignableFrom(cl))
serializer = new RemoteSerializer();

else if (Map.class.isAssignableFrom(cl))
serializer = new MapSerializer();
// 省略部分相似代码....


// 如果以上都未能找到合适的序列化类,则使用默认序列化类(JavaSerializer,通常序列化我们自定义类的就是它),
if (serializer == null)

serializer = getDefaultSerializer(cl);


if (_cachedSerializerMap == null)
_cachedSerializerMap = new HashMap(8);


// 放入缓存map中,下次获取同样的序列化类就比较方便,不需要再经过那么多判断了
_cachedSerializerMap.put(cl, serializer);

return serializer;
}

[b][size=medium]3.serializer.writeObject(object, this); [/size][/b]

这里使用刚才获取到的Serializer类(可能是JavaSerializer,也可能是BasicSerializer或者其他序列化类)来序列化对象,具体实现留待下次分析

总结一下序列化的过程就是:

[img]http://dl.iteye.com/upload/attachment/0072/8677/a1501172-8e2d-39af-9e64-19d916d00d73.jpg[/img]

[size=medium][b]总结[/b][/size]

1.如何使用Hessian序列化对象;

2.Hessian序列化对象分哪几步,每一步的大概含义是什么?

3.SerializerFactory是什么,它默认做了哪些工作?

下一节,我们将深入各个序列化类的具体实现,欢迎朋友指正!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值