`
DiaoCow
  • 浏览: 242123 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Hessian源码学习(六)CollectionSerializer, MapSerializer

阅读更多
分析了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
0
0
分享到:
评论

相关推荐

    hessian源码修改,包含了协议的修改

    公司搞soa治理,正好采用hessian的export暴露接口,我修改了下,客户端不需要采用url,直接采用servicename,从zookeeper取地址列表。客户端和服务端通过mina通讯,不采用原生的http协议。目前mina的编码解码还有待...

    Hessian源码分析和Hack.doc

    项目选定Hessian作为web service的实现方式,确实很轻量级,速度就跟直接用socket差不多,全是二进制传送节约了不少开销。但是在使用过程中有业务需要是必须获得远程端的ip地址,主机名等信息的。翻便Hessian的文档...

    hessian-4.0.38-sources.jar

    hessian源码

    Hessian-4.0.7(Jar包 + 源码)

    Hessian 4.0.7 Jar 源码, Hessian 4.0.7 Jar 源码, Hessian 4.0.7 Jar 源码

    Hessian的学习笔记

    Hessian的学习笔记

    android实现Hessian通信源码

    在android与web端实现hessian通信,源码为android客户端源码,jar包来自http://hsrong.iteye.com/blog/1719996,google官网提供的hessdroid不可用,因为里面包含一些android不支持的类;hessian官网的jar包适用于web...

    hessian-3.2.0源码

    hessian-3.2.0源码,在做分布式交互时,可能要重写hessian

    Hessian源码示例

    使用HessianCSharp编写的服务端与客户端,使用最少量的代码实现Hello

    Hessian学习入门实例

    这是一个Hessian入门学习的实例,程序包是一个web工程,使用intellij idea + Maven开发,其中通过两个方式展示了使用Hessian实现RMI的原理,一个是访问jsp页面,一个是在代码中手工创建client。对于Hessian Servlet...

    hessian最新源码分析.pdf

    hessian最新源码分析.pdf

    Hessian学习简单demo

    想学习Hessian的同志们,这个是一个简单的demo。比较简单,不过能够加深对Hessian的理解

    hessian3.0.1.jar

    hessian3.0.1.jar, 可以和spring1.x集成,不会报错

    hessian学习实例

    hessian学习实例,hessian框架例子,与Spring集成。包括了server端和client端

    hessian学习基础篇——序列化和反序列化

    NULL 博文链接:https://qinghua0208.iteye.com/blog/493516

    hessian php与java通讯demo源码

    hessian php与java通讯demo源码

    Hessian-3.2.1.jar和源码

    Hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能。相比Webservice,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合发送二进制数据。

    dubbo源码依赖hessian_lite.jar

    dubbo源码依赖hessian_lite,可以使用mvn install命令将jar包安装到本地的maven仓库

    hessian案例,hessian案例

    该案例有hessian java python,该案例有hessian java python,该案例有hessian java python

    hessian-4.0.37-src.jar

    Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。

    Hessian多个版本打包下载

    Hessian多个版本下载,包括Hessian3.1.6,Hessian3.2.1,Hessian4.0.7

Global site tag (gtag.js) - Google Analytics