Hessian源码学习(三)
今天我们重点来看看Hessian是如何实现序列化的(这些序列化类可以脱离hessian源码包,单独拿出来使用),参考源码版本为3.0.20
首先我们看下序列化一个对象的代码:
// 这里可以是任何形式的OutputStream,现以FileOutputStream为例OutputStream os = new FileOutputStream("hessianOutput"); // 创建 HessianOutput对象AbstractHessianOutput out = new HessianOutput(os); // 设置序列化工厂 out.setSerializerFactory(new SerializerFactory()); // 序列化 obj对象(obj可以是一个简单对象比如Integer,String,也可以是一个自定义类,同时也可以// 是数组,枚举,集合等等)out.writeObject(obj); // 静态代码快static { // 创建序列化和反序列化map,至于其中的Key-Value 我想大家也能猜到,key就是某个需要序列化的class,value就是序列化该class的Serializer类 _serializerMap = new HashMap(); _deserializerMap = new HashMap(); _typeMap = new HashMap();// 初始化序列化和反序列化map (对于“简单类型”都使用BasicSerializer作为它的序列化类) addBasic(void.class, "void", BasicSerializer.NULL); addBasic(Boolean.class, "boolean", BasicSerializer.BOOLEAN); addBasic(Byte.class, "byte", BasicSerializer.BYTE); addBasic(Short.class, "short", BasicSerializer.SHORT); addBasic(Integer.class, "int", BasicSerializer.INTEGER); addBasic(Long.class, "long", BasicSerializer.LONG); addBasic(Float.class, "float", BasicSerializer.FLOAT); addBasic(Double.class, "double", BasicSerializer.DOUBLE); addBasic(Character.class, "char", BasicSerializer.CHARACTER); addBasic(String.class, "string", BasicSerializer.STRING); addBasic(Object.class, "object", BasicSerializer.OBJECT); addBasic(java.util.Date.class, "date", BasicSerializer.DATE); addBasic(boolean.class, "boolean", BasicSerializer.BOOLEAN); addBasic(byte.class, "byte", BasicSerializer.BYTE); addBasic(short.class, "short", BasicSerializer.SHORT); addBasic(int.class, "int", BasicSerializer.INTEGER); addBasic(long.class, "long", BasicSerializer.LONG); addBasic(float.class, "float", BasicSerializer.FLOAT); addBasic(double.class, "double", BasicSerializer.DOUBLE); addBasic(char.class, "char", BasicSerializer.CHARACTER); addBasic(boolean[].class, "[boolean", BasicSerializer.BOOLEAN_ARRAY); addBasic(byte[].class, "[byte", BasicSerializer.BYTE_ARRAY); addBasic(short[].class, "[short", BasicSerializer.SHORT_ARRAY); addBasic(int[].class, "[int", BasicSerializer.INTEGER_ARRAY); addBasic(long[].class, "[long", BasicSerializer.LONG_ARRAY); addBasic(float[].class, "[float", BasicSerializer.FLOAT_ARRAY); addBasic(double[].class, "[double", BasicSerializer.DOUBLE_ARRAY); addBasic(char[].class, "[char", BasicSerializer.CHARACTER_ARRAY); addBasic(String[].class, "[string", BasicSerializer.STRING_ARRAY); addBasic(Object[].class, "[object", BasicSerializer.OBJECT_ARRAY); _serializerMap.put(Class.class, new ClassSerializer()); _deserializerMap.put(Class.class, new ClassDeserializer()); _deserializerMap.put(Number.class, new BasicDeserializer(BasicSerializer.NUMBER)); _serializerMap.put(BigDecimal.class, new StringValueSerializer()); try { _deserializerMap.put(BigDecimal.class, new StringValueDeserializer(BigDecimal.class)); } catch (Throwable e) { } // 后面代码省略,内容基本同上}// addBasic 做的很简单 以 addBasic(Integer.class, "int", BasicSerializer.INTEGER); 为例子实际上就是_serializerMap.put(Integer.class, new BasicSerializer(BasicSerializer.INTEGER));private static void addBasic(Class cl, String typeName, int type){// 放入key-value_serializerMap.put(cl, new BasicSerializer(type));Deserializer deserializer = new BasicDeserializer(type);_deserializerMap.put(cl, deserializer);_typeMap.put(typeName, deserializer);}public void writeObject(Object object) throws IOException{if (object == null) { writeNull(); return;}Serializer serializer;//从序列化工厂得到能够序列化该对象的序列化类serializer = _serializerFactory.getSerializer(object.getClass()); //使用具体的序列化类序列化对象serializer.writeObject(object, this); }public Serializer getSerializer(Class cl) throws HessianProtocolException{ Serializer serializer;// 如果是简单类型,那么直接就能获取到(备注:这里能够取到的都是之前在SerializerFactory的static静态代码块中初始化的那些key) serializer = (Serializer) _serializerMap.get(cl); if (serializer != null) return serializer;// 从缓存中取 (为什么这里有个缓存的东西,看后面代码就立刻明了) if (_cachedSerializerMap != null) { serializer = (Serializer) _cachedSerializerMap.get(cl); if (serializer != null)return serializer; }// 省略部分代码....// 获取其他类型的序列化类 if (serializer != null) { } else if (HessianRemoteObject.class.isAssignableFrom(cl)) serializer = new RemoteSerializer(); else if (BurlapRemoteObject.class.isAssignableFrom(cl)) serializer = new RemoteSerializer(); else if (Map.class.isAssignableFrom(cl)) serializer = new MapSerializer(); else if (Collection.class.isAssignableFrom(cl)) { if (_collectionSerializer == null) {_collectionSerializer = new CollectionSerializer(); } serializer = _collectionSerializer; } else if (cl.isArray()) serializer = new ArraySerializer(); else if (Throwable.class.isAssignableFrom(cl)) serializer = new ThrowableSerializer(cl); else if (InputStream.class.isAssignableFrom(cl)) serializer = new InputStreamSerializer(); else if (Iterator.class.isAssignableFrom(cl)) serializer = IteratorSerializer.create(); else if (Enumeration.class.isAssignableFrom(cl)) serializer = EnumerationSerializer.create(); else if (Calendar.class.isAssignableFrom(cl)) serializer = CalendarSerializer.create(); else if (_enumClass != null && _enumClass.isAssignableFrom(cl)) serializer = new EnumSerializer(cl); if (serializer == null) // 使用默认序列化类(JavaSerializer),一般是序列化我们自定义类的 serializer = getDefaultSerializer(cl); if (_cachedSerializerMap == null) _cachedSerializerMap = new HashMap(8);// 放入缓存map中,下次获取同样的序列化类就比较方便,不需要再经过那么多判断了 _cachedSerializerMap.put(cl, serializer); return serializer;}