您的位置:首页 > 移动开发 > Objective-C

ObjectInputStream解析

2016-03-14 16:56 381 查看
此类比较复杂,断断续续看了一个月。

ObjectInputStream 类的职责是:从序列化文档中读取并解析出一个类。这个序列化文档是由 ObjectOutputStream 写入的。这一功能允许我们持久化一个内存对象,这便是序列化。Java IO 库规定了序列化的存储规范,从上层到下层是,对象,块存储,块内元素(块数据类型,块长度,数据)。

ObjectInputStream 包括以下子类:GetFieldImpl ,HandleTable ,BlockDataInputStream,PeekInputStream,ValidationList

GetFieldImpl

GetFieldImpl 继承自 GetField,是一个获得对象属性的服务。它通过内聚了一个 ObjectStreamClass 对象获得类的元数据信息描述,向上使用 ObjectInputStream 的 readObject0 方法读取流数据,形成对象。通过这一措施,GetFiledImpl 可以对外提供已经序列化的对象的属性访问服务。

HandleTable 是在读取流数据根据类元数据信息描述形成对象的过程中,可能出现的异常(如 ClassNotFoundException)。因在解析对象的过程中,是链式地解析的,因此 HandleTable 会沿着解析链挨个存下异常信息。

BlockDataInputStream 是从流数据文件中读取“块”的服务,它不仅可以读取块,也可以读取字节,读取 UTF 字符等等。因为对象被序列化成文件流后是以块的形式存储的。而 primitive data (八大基础类型)可以直接使用字节存储。

PeekInputStream 已经在本博客中解析过,正如其名,它在不移动文件指针的情况下向前读一个字节,“偷窥”。这一服务刚好应用于读取流文件中对象的类型。

ValidationList 此类没有细分析,应该是用于解析中的某种校验。

从总体上看,ObjectInputStream 的步骤为:使用 BlockDataInput 读取流中类元信息数据,得到 ObjectStreamClass 对象,于是便可获得各属性的签名,再根据对象的类型,读取流中的对象数据生成对象。

此类的分析过程嗑嗑碰碰,前后花了很多时间,究其原因是太在意于细节,而 ObjectInputStream 的实现又比较复杂,牵扯到的类,内部类都非常多,因此往往为了分析清楚一个类,而要研究很多其它的类,往往看了后面,前面又忘了。今天突然领悟到一个心得,无论从底往上还是从上往下去了解一个东西,心中都要有“全局观”。有时候,究细节没有太大 意义,只为了搞懂一个使用大量技巧的实现而采用的方法,在上面花的时间往往是不值得的,我们只需要搞清楚是怎么回事即可,细节往往复用性有限,思路复用性更大。回到看代码上,如果采用的是自底向上的方式,研究类时可不用在意细节,搞清楚类的职能,使用了什么手段实现的,不必在意一个方法为什么这么写,有什么好处。

如果你的目的是为了搞清楚火车生产的流程,不必研究钢的炼制过程,那是另一个领域。不要脱离了原来的方向,在路程上逗留了太久。生命有限,不应该错过真正重要的东西。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: