hessian 序列化實現 初探
阿新 • • 發佈:2018-12-26
眾所周知大名鼎鼎的開源remoting的框架hessian的速度是非常快的,有人做過測試:一個UserData類,有一個字串屬性,一個日期屬性,一個double屬性,分別用java,hessian來序列化一百萬次,結果讓人吃驚,不止是hessian序列化的速度要比java的快上一倍,而且hessian序列化後的位元組數也要比java的少一倍.總是疑惑不解,為什麼hessian的速度會那麼快,這估計還是要歸功於它的序列化的實現機制。興趣上來了,決定看一下它是如何來實現它的序列化的。
開啟hessian原始碼,我們可以看到com.caucho.hessian.io這個包是hessian實現序列化與反序列化的核心包,從程式碼結構上我們不難發現,AbstractSerializerFactory,AbstractHessianOutput,AbstractSerializer,AbstractHessianInput,AbstractDeserializer是hessian實現序列化和反序列化的核心結構程式碼。
首先我們來看下AbstractSerializerFactory,它有2個抽象方法
根據類來決定用哪種序列化工具類
Java程式碼
根據類來決定用哪種反序列化工具類
Java程式碼
SerializerFactory繼承AbstractSerializerFactory,而且在SerializerFactory有很多靜態map用來存放類與序列化和反序列化工具類的對映,這樣如果已經用過的序列化工具就可以直接拿出來用,不必再重新例項化工具類。
Java程式碼
在SerializerFactory中,實現了抽象類的getSerializer方法,根據不同的需要被序列化的類來獲得不同的序列化工具,一共有17種序列化工具,hessian為不同的型別的java物件實現了不同的序列化工具,預設的序列化工具是JavaSerializer
Java程式碼
在SerializerFactory中,實現了抽象類的getDeserializer方法,根據不同的需要被反序列化的類來獲得不同的反序列化工具,預設的反序列化工具類是JavaDeserializer
Java程式碼
下面我們來看一下HessianOutput,它繼承AbstractHessianOutput成為序列化輸出流的一種實現
它會實現很多方法,用來做流輸出為了標誌某種特定含義的分隔,在這裡就不詳細說了,如:
Java程式碼
需要注意的是方法,它會呼叫先serializerFactory根據類來獲得serializer序列化工具類
Java程式碼
現在我們來看看AbstractSerializer,其中writeObject為必須在子類實現的方法,AbstractSerializer有17種子類實現,hessian根據不同的java物件型別來實現了不同的序列化工具類,其中預設的是JavaSerializer
開啟hessian原始碼,我們可以看到com.caucho.hessian.io這個包是hessian實現序列化與反序列化的核心包,從程式碼結構上我們不難發現,AbstractSerializerFactory,AbstractHessianOutput,AbstractSerializer,AbstractHessianInput,AbstractDeserializer是hessian實現序列化和反序列化的核心結構程式碼。
首先我們來看下AbstractSerializerFactory,它有2個抽象方法
根據類來決定用哪種序列化工具類
Java程式碼
- abstract public Serializer getSerializer(Class cl)
- throws HessianProtocolException;
根據類來決定用哪種反序列化工具類
Java程式碼
- abstract public Deserializer getDeserializer(Class cl)
-
throws HessianProtocolException;
SerializerFactory繼承AbstractSerializerFactory,而且在SerializerFactory有很多靜態map用來存放類與序列化和反序列化工具類的對映,這樣如果已經用過的序列化工具就可以直接拿出來用,不必再重新例項化工具類。
Java程式碼
- private static HashMap _staticSerializerMap;
- private static HashMap _staticDeserializerMap;
在SerializerFactory中,實現了抽象類的getSerializer方法,根據不同的需要被序列化的類來獲得不同的序列化工具,一共有17種序列化工具,hessian為不同的型別的java物件實現了不同的序列化工具,預設的序列化工具是JavaSerializer
Java程式碼
- public Serializer getSerializer(Class cl)
- throws HessianProtocolException
- {
- Serializer serializer;
- serializer = (Serializer) _staticSerializerMap.get(cl);
- if (serializer != null)
- return serializer;
- if (_cachedSerializerMap != null) {
- synchronized (_cachedSerializerMap) {
- serializer = (Serializer) _cachedSerializerMap.get(cl);
- }
- if (serializer != null)
- return serializer;
- }
- for (int i = 0;
- serializer == null && _factories != null && i < _factories.size();
- i++) {
- AbstractSerializerFactory factory;
- factory = (AbstractSerializerFactory) _factories.get(i);
- serializer = factory.getSerializer(cl);
- }
- if (serializer != null) {
- }
- else if (JavaSerializer.getWriteReplace(cl) != null)
- serializer = new JavaSerializer(cl);
- else if (HessianRemoteObject.class.isAssignableFrom(cl))
- serializer = new RemoteSerializer();
- else if (BurlapRemoteObject.class.isAssignableFrom(cl))
- serializer = new RemoteSerializer();
- else if (Map.class.isAssignableFrom(cl)) {
- if (_mapSerializer == null)
- _mapSerializer = new MapSerializer();
- serializer = _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 (Locale.class.isAssignableFrom(cl))
- serializer = LocaleSerializer.create();
- else if (Enum.class.isAssignableFrom(cl))
- serializer = new EnumSerializer(cl);
- if (serializer == null)
- serializer = getDefaultSerializer(cl);
- if (_cachedSerializerMap == null)
- _cachedSerializerMap = new HashMap(8);
- synchronized (_cachedSerializerMap) {
- _cachedSerializerMap.put(cl, serializer);
- }
- return serializer;
- }
在SerializerFactory中,實現了抽象類的getDeserializer方法,根據不同的需要被反序列化的類來獲得不同的反序列化工具,預設的反序列化工具類是JavaDeserializer
Java程式碼
- public Deserializer getDeserializer(Class cl)
- throws HessianProtocolException
- {
- Deserializer deserializer;
- deserializer = (Deserializer) _staticDeserializerMap.get(cl);
- if (deserializer != null)
- return deserializer;
- if (_cachedDeserializerMap != null) {
- synchronized (_cachedDeserializerMap) {
- deserializer = (Deserializer) _cachedDeserializerMap.get(cl);
- }
- if (deserializer != null)
- return deserializer;
- }
- for (int i = 0;
- deserializer == null && _factories != null && i < _factories.size();
- i++) {
- AbstractSerializerFactory factory;
- factory = (AbstractSerializerFactory) _factories.get(i);
- deserializer = factory.getDeserializer(cl);
- }
- if (deserializer != null) {
- }
- else if (Collection.class.isAssignableFrom(cl))
- deserializer = new CollectionDeserializer(cl);
- else if (Map.class.isAssignableFrom(cl))
- deserializer = new MapDeserializer(cl);
- else if (cl.isInterface())
- deserializer = new ObjectDeserializer(cl);
- else if (cl.isArray())
- deserializer = new ArrayDeserializer(cl.getComponentType());
- else if (Enumeration.class.isAssignableFrom(cl))
- deserializer = EnumerationDeserializer.create();
- else if (Enum.class.isAssignableFrom(cl))
- deserializer = new EnumDeserializer(cl);
- else
- deserializer = getDefaultDeserializer(cl);
- if (_cachedDeserializerMap == null)
- _cachedDeserializerMap = new HashMap(8);
- synchronized (_cachedDeserializerMap) {
- _cachedDeserializerMap.put(cl, deserializer);
- }
- return deserializer;
- }
下面我們來看一下HessianOutput,它繼承AbstractHessianOutput成為序列化輸出流的一種實現
它會實現很多方法,用來做流輸出為了標誌某種特定含義的分隔,在這裡就不詳細說了,如:
Java程式碼
- public void startCall()
- throws IOException
- {
- os.write('c');
- os.write(0);
- os.write(1);
- }
需要注意的是方法,它會呼叫先serializerFactory根據類來獲得serializer序列化工具類
Java程式碼
- public void writeObject(Object object)
- throws IOException
- {
- if (object == null) {
- writeNull();
- return;
- }
- Serializer serializer;
- serializer = _serializerFactory.getSerializer(object.getClass());
- serializer.writeObject(object, this);
- }
現在我們來看看AbstractSerializer,其中writeObject為必須在子類實現的方法,AbstractSerializer有17種子類實現,hessian根據不同的java物件型別來實現了不同的序列化工具類,其中預設的是JavaSerializer