Hessian源码学习(六)CollectionSerializer, MapSerializer

分析了BasicSerializer和JavaSerializer,剩下的序列化类就比较简单了,其实最本质的是基本类型的序列化[url]http://diaocow.iteye.com/blog/1317164[/url],其他任何类型的序列化最后都可以回归到基本类型的序列化;

[b]隐隐的感觉透着递归的理念,最后递归到一个基本问题的解决![/b]

今天我们分析下CollectionSerializer和MapSerializer(参考源码版本3.0.13)。

[b][size=medium]1.CollectionSerializer[/size][/b]

public void writeObject(Object obj, AbstractHessianOutput out)
throws IOException
{
Collection list = (Collection) obj;

Class cl = obj.getClass();
boolean hasEnd;

// 输出集合头,格式:'Vt' [类型名] ['l'集合大小] 并且总是返回true
if (cl.equals(ArrayList.class) || ! _sendJavaType)
hasEnd = out.writeListBegin(list.size(), null);
else
hasEnd = out.writeListBegin(list.size(), obj.getClass().getName());

// 循环序列化每一个集合元素
Iterator iter = list.iterator();
while (iter.hasNext()) {
Object value = iter.next();
// 若不清楚这里面做了什么,请看Hessian源码学习(三)
out.writeObject(value);
}

// 输出结束标记'z'
if (hasEnd)
out.writeListEnd();
}



[b][size=medium]2.MapSerializer[/size][/b]

public void writeObject(Object obj, AbstractHessianOutput out)
throws IOException
{
if (out.addRef(obj))
return;

Map map = (Map) obj;

Class cl = obj.getClass();
// 输出Map头,格式:'Mt'[类型名]
if (cl.equals(HashMap.class))
out.writeMapBegin(null);
else
out.writeMapBegin(obj.getClass().getName());

// 循环序列化每一个键值对
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();

// 分别序列化键、值 (若不清楚这里面做了什么,请看Hessian源码学习(三))
out.writeObject(entry.getKey());
out.writeObject(entry.getValue());
}
// 输出结束标记'z'
out.writeMapEnd();
}


是不是很简单,我们以一个例子作为文章的结束:
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("key1", 100);
map.put("key2", 200);
map.put("key3", 300);

OutputStream os = new FileOutputStream("hessianOutput");
AbstractHessianOutput out = new HessianOutput(os);
out.setSerializerFactory(new SerializerFactory());
out.writeObject(map);


[img]http://dl.iteye.com/upload/attachment/0072/9513/897e6fbf-3044-363e-a1c8-df642afe12a5.jpg[/img]

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

通过JavaSerializer, CollectionSerializer, MapSerializer我们可以看出,任何类型的序列化都可以回归到基本类型的序列化;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值