Hessian源码学习(七)
今天重新看了一下Hessian的序列化类,发现了一个之前被自己忽略的地方,而这应该也是Hessian序列化较快的原因之一。
在大多数序列化类开始之前都有这么一段代码:
/** * Reads an object from the input stream with an expected type. */ public Object readObject(Class cl) throws IOException { if (cl == null || cl == Object.class) return readObject(); int tag = read(); switch (tag) { case 'N': return null; case 'M': { String type = readType(); Deserializer reader; reader = _serializerFactory.getObjectDeserializer(type); if (cl != reader.getType() && cl.isAssignableFrom(reader.getType())) return reader.readMap(this); reader = _serializerFactory.getDeserializer(cl); return reader.readMap(this); } case 'V': { String type = readType(); int length = readLength(); Deserializer reader; reader = _serializerFactory.getObjectDeserializer(type); if (cl != reader.getType() && cl.isAssignableFrom(reader.getType())) return reader.readList(this, length); reader = _serializerFactory.getDeserializer(cl); Object v = reader.readList(this, length); return v; } // 如果是一个引用标识: case 'R': { // 读取标示的值(比如刚才例子那段代码就是0) int ref = parseInt(); // 返回对象 return _refs.get(ref); } case 'r': { String type = readType(); String url = readString(); return resolveRemote(type, url); } } _peek = tag; Object value = _serializerFactory.getDeserializer(cl).readObject(this); return value; }