分析了BasicSerializer和JavaSerializer,剩下的序列化类就比较简单了,其实最本质的是基本类型的序列化
http://diaocow.iteye.com/blog/1317164,其他任何类型的序列化最后都可以回归到基本类型的序列化;
隐隐的感觉透着递归的理念,最后递归到一个基本问题的解决!
今天我们分析下CollectionSerializer和MapSerializer(参考源码版本3.0.13)。
1.CollectionSerializer
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();
}
2.MapSerializer
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);
总结
通过JavaSerializer, CollectionSerializer, MapSerializer我们可以看出,任何类型的序列化都可以回归到基本类型的序列化;
- 大小: 51.2 KB
分享到:
相关推荐
公司搞soa治理,正好采用hessian的export暴露接口,我修改了下,客户端不需要采用url,直接采用servicename,从zookeeper取地址列表。客户端和服务端通过mina通讯,不采用原生的http协议。目前mina的编码解码还有待...
项目选定Hessian作为web service的实现方式,确实很轻量级,速度就跟直接用socket差不多,全是二进制传送节约了不少开销。但是在使用过程中有业务需要是必须获得远程端的ip地址,主机名等信息的。翻便Hessian的文档...
hessian源码
Hessian 4.0.7 Jar 源码, Hessian 4.0.7 Jar 源码, Hessian 4.0.7 Jar 源码
Hessian的学习笔记
在android与web端实现hessian通信,源码为android客户端源码,jar包来自http://hsrong.iteye.com/blog/1719996,google官网提供的hessdroid不可用,因为里面包含一些android不支持的类;hessian官网的jar包适用于web...
hessian-3.2.0源码,在做分布式交互时,可能要重写hessian
使用HessianCSharp编写的服务端与客户端,使用最少量的代码实现Hello
这是一个Hessian入门学习的实例,程序包是一个web工程,使用intellij idea + Maven开发,其中通过两个方式展示了使用Hessian实现RMI的原理,一个是访问jsp页面,一个是在代码中手工创建client。对于Hessian Servlet...
hessian最新源码分析.pdf
想学习Hessian的同志们,这个是一个简单的demo。比较简单,不过能够加深对Hessian的理解
hessian3.0.1.jar, 可以和spring1.x集成,不会报错
hessian学习实例,hessian框架例子,与Spring集成。包括了server端和client端
NULL 博文链接:https://qinghua0208.iteye.com/blog/493516
hessian php与java通讯demo源码
Hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能。相比Webservice,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合发送二进制数据。
dubbo源码依赖hessian_lite,可以使用mvn install命令将jar包安装到本地的maven仓库
该案例有hessian java python,该案例有hessian java python,该案例有hessian java python
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
Hessian多个版本下载,包括Hessian3.1.6,Hessian3.2.1,Hessian4.0.7