<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Hessian 3.2.0的兩個bug

    在將Hessian從3.0.13升級到3.2.0時碰到兩個bug和一個ClassLoader處理策略的改變的問題,在此記錄下,希望能為使用Hessian 3.2.0的同學們提供點幫助,避免再走同樣的彎路。

    Bug 1:HessianInput的readObject(Class)無效
    對于使用Hessian 1的同學而言,有可能會使用到HessianInput的readObject(Class)這個方法,以實現將輸入流反序列化為指定的類實例,這在有一個場景中是很需要的,例如序列化時序列化的是一個子類對象,但反序列化時需要反序列化為父類,這個時候就非常需要這方法了,在Hessian 3.2.0之前的版本中這個沒有問題,但升級到3.2.0后就出現問題了,指定了Class會無效。
    跟蹤Hessian 3.2.0代碼,發現它把之前版本的HessianInput的readObject(Class)方法做了改動,改為了:
        String type = readType();

          
    // hessian/3386
          if ("".equals(type)) {
        Deserializer reader;
        reader 
    = _serializerFactory.getDeserializer(cl);

        
    return reader.readMap(this);
          }
          
    else {
        Deserializer reader;
        reader 
    = _serializerFactory.getObjectDeserializer(type);

            
    return reader.readMap(this);
          }
    從上面代碼可以看出,只要序列化流中有類型信息,那么就完全忽視傳入的指定的Class類型,而在hessian中貌似只有Map類型的才不會寫type信息,其他都會寫,所以就導致了這個地方大多數情況下都會無視傳入的指定的Class類型,更讓人郁悶的是,去看Hessian2Input.readObject(Class)方法,它的處理方式就是正確的,在type不為""的情況下,它的處理方式為:
    Deserializer reader;
        reader 
    = findSerializerFactory().getObjectDeserializer(type, cl);

        
    return reader.readMap(this);
    而默認的SerializerFactory的getObjectDeserializer的實現如下:
    Deserializer reader = getObjectDeserializer(type);
        
        
    if (cl == null
        
    || cl.equals(reader.getType())
        
    || cl.isAssignableFrom(reader.getType())
        
    || HessianHandle.class.isAssignableFrom(reader.getType())) {
          
    return reader;
        }

        
    if (log.isLoggable(Level.FINE)) {
          log.fine(
    "hessian: expected '" + cl.getName() + "' at '" + type + "' ("
               
    + reader.getType().getName() + ")");
        }
        
        
    return getDeserializer(cl);
    從上面這段代碼的實現來看,是可以滿足傳入指定的Class類型的方式的需求的。

    因此修正這個BUG的方法為,繼承HessianInput,并覆蓋它的readObject(Class)方法,將其中type不為""的處理方式改成和Hessian2Input一樣,重新測試,OK。
    這個Bug即使到最新的Hessian 3.2.1里也沒有修復,因此暫時仍然需要自行處理。

    Bug 2:當Map中或對象中有兩個long[]時反序列化出錯
    這個問題還真要湊巧才能碰上,大家可以自己寫段簡單的程序測試一下,用Hessian2Input和Hessian2Output去完成下面datas對象的序列化和反序列化:
    Map<String,Object> datas=new HashMap<String,Object>();
    datas.put(
    "1",new long[]{1L,-1L});
    datas.put(
    "2",new long[]{2L,-2L});
    反序列化的時候會拋出UnsupportedOperationException或java.util.Map cannot assigned from null這樣的異常信息,而且如果Map中只有一個long[]數組是不會拋異常的,詭異呀,跟蹤Hessian 3.2.0代碼,發現有個很詭異的地方,在有兩個數組后,Hessian會調用BasicDeserializer中的readLengthList方法,這個方法中竟然沒有對long[]數組的處理,而只有對其他布爾型數組、短整型數組、整型數組等的處理,而當long[]數組的情況調用這個方法時,即拋出了UnsupportedOperationException異常,而更搞的是BasicDeserializer中的readList方法中是有對long[]數組的處理的,于是基本可以判斷是Hessian的開發者漏寫了對long[]的處理。
    修正這個bug可以采用這兩種方法:
    1、修改BasicDeserializer,在readLengthList方法中加上對LONG_ARRAY的處理;
    2、升級為Hessian 3.2.1,修復了這個bug,修復方法和1相同。

    在升級到Hessian 3.2.0或3.2.1時還有個需要注意的問題,對于有些需要操作序列化時ClassLoader的同學有可能會碰到,Hessian 3.2.0以前的版本是在反序列化之前獲取線程上下文ClassLoader來獲取Class的,但在3.2.0+后,改變了這個策略,改為了在SerializerFactory實例化的時候就去獲取線程上下文ClassLoader,以后在反序列化時就不再去獲取了,這個方式對于需要控制ClassLoader的同學來說會有點麻煩,但還好Hessian還提供了一個方式,就是允許在創建SerializerFactory對象時傳入ClassLoader,這就爽了,不用像以前一樣需要通過控制線程上下文ClassLoader了,這種方式更為優雅,值得推薦。

    posted on 2009-08-06 11:19 BlueDavy 閱讀(9127) 評論(0)  編輯  收藏 所屬分類: Java

    公告

     









    feedsky
    抓蝦
    google reader
    鮮果

    導航

    <2009年8月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    統計

    隨筆分類

    隨筆檔案

    文章檔案

    Blogger's

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品自偷自拍无码| 亚洲av日韩av高潮潮喷无码| 亚洲成年人免费网站| 永久免费av无码网站yy| 国产V亚洲V天堂A无码| 国产一二三四区乱码免费| 亚洲精品午夜国产VA久久成人| 久久www免费人成精品香蕉| 综合亚洲伊人午夜网| 国产午夜无码片免费| 亚洲AV无码一区二区二三区入口| 国产精品视频全国免费观看| 亚洲最大AV网站在线观看| 一级一级一级毛片免费毛片| 亚洲一级片免费看| 国产午夜成人免费看片无遮挡| 国产亚洲精久久久久久无码| 无码成A毛片免费| 亚洲一区在线视频观看| 女人18毛片特级一级免费视频| 国产成人 亚洲欧洲| 亚洲色大成网站www永久一区| 久久久久久久岛国免费播放| 亚洲人成伊人成综合网久久| 在线免费观看视频你懂的| 在线播放亚洲精品| 亚洲国产一成人久久精品| 亚洲免费观看网站| 国产精品亚洲小说专区| 久久亚洲综合色一区二区三区| 5g影院5g天天爽永久免费影院 | 国产卡二卡三卡四卡免费网址| 亚洲三级视频在线| 亚洲国产一级在线观看 | 免费看一区二区三区四区| 亚洲视频一区在线播放| 日韩成人在线免费视频| 99久久成人国产精品免费| 亚洲一级片在线观看| 亚洲午夜无码AV毛片久久| 久久受www免费人成_看片中文|