分享

Hadoop_IPC序列化对象的分析

 Chi_Way 2011-07-11

IPC序列化对象的分析:

序列化对象网络中传递格式,对象类名(UTF8.writeString)+对象数据,对象数据分一下几种情况

(1)数组:数组长度+元素对象数据(递归)

(2)字符串:UTF8.writeString

(3)primitive type:DataOutput接口输出

(4)枚举:枚举名字(UTF8.writeString)

(5)Writable的实现类:Writable对象类名+对象实际数据

关键问题是如何解读序列化数据,得到对象类名之后,首先利用保存的primitive type散列表查看一下(尽量避免调用Class.forName以提高性能),再Thread.currentThread().getContextClassLoader()获得当前线程加载器以防止第三方实现Writable接口的类无法加载的情况。

对类名存在而对象实例为空的情况作特殊处理,空对象的意思是有一个类名,但是对象数据是NULL,也就是对象类名(UTF8.writeString)+NULL,这时会使用内部类NullInstance保存声称的对象类名,而把NullInstance对象实例按Writable序列化,也就是Writable.class.getName()+ NullInstance数据。

在解读Writable实际对象的时候需要注意的问题就是,从字符串到Class<?>的转化是由类加载器完成的,但是从Class<?>到实际对象的转化是由对象工厂完成(WritableFactories),WritableFactories保存一个从Class<?extends Writable>的散列表,以便得到工厂对象。如果这个Writable在加载时没有在WritableFactories中设置它的工厂对象,就从Class<?>获得构造方法,构造对象。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多