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

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

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

    Hessian/Java反序列化采用自定義的Classloader

    對于采用OSGi來做系統的人而言,ClassLoader的問題必然是頭號需要解決的問題,如果又是個需要遠程通訊的OSGi應用的話,那么反序列化的classloader問題幾乎可以肯定是會碰到的,來看看在如今流行的兩種序列化、反序列化協議:java/hessian中如何使用自定義的classloader。
    java/hessian并不提供直接的傳入ClassLoader類來改變反序列化時采用的ClassLoader,hessian采用的為使用當前線程的上下文ClassLoader來加載反序列化的類,java則采用堆棧上最近的一個ClassLoader類來加載,可以認為就是調用類所在的ClassLoader來加載,但在OSGi應用中,通常采用以上默認的行為來反序列化加載類是會出問題的,因此需要采用自定義的。
    先來看看java的,Java在ObjectInputStream.readObject時最后采用的是resolveClass方法來加載類:
    protected Class<?> resolveClass(ObjectStreamClass desc)
        
    throws IOException, ClassNotFoundException
        {
        String name 
    = desc.getName();
        
    try {
            
    return Class.forName(name, false, latestUserDefinedLoader());
        } 
    catch (ClassNotFoundException ex) {
            Class cl 
    = (Class) primClasses.get(name);
            
    if (cl != null) {
            
    return cl;
            } 
    else {
            
    throw ex;
            }
        }
        }
    驚喜的是,resolveClass是protected的,:),還好,還留下了這一手,于是毫不客氣,寫一個繼承ObjectInputStream的子類,然后覆蓋resolveClass方法即可,到這步了就可以隨意用自己的ClassLoader來實現加載了。
    OK,java的解決了,來看Hessian的,Hessian在加載類的時候采用了下面的代碼:
    if (type.startsWith("[")) {
          Deserializer subDeserializer 
    = getDeserializer(type.substring(1));
          deserializer 
    = new ArrayDeserializer(subDeserializer);
        }
        
    else {
          
    try {
        ClassLoader loader 
    = Thread.currentThread().getContextClassLoader();
          
        Class cl 
    = Class.forName(type, false, loader);

        deserializer 
    = getDeserializer(cl);
          } 
    catch (Exception e) {
          }
        }
    看過這段代碼后,就明白,要替換,最明顯的一種做法是替換當前線程的上下文classloader,而這通常有一定的風險,因為可能會有很多代碼使用到線程的上下文classloader,另外一種可選的做法就是繼承SerializerFactory,覆蓋其中的getDeserializer方法,從而實現對加載類的ClassLoader的控制,這種方式風險就比較小了。
    為了能實現使用自定義的classloader后可以加載到所有bundle export package中的類,在自定義classloader所在的Bundle中需要加上DynamicImport-Package,這樣可以比較簡單的實現。
    在Equinox中,則還可以選擇實現ClassLoadingHook,這樣可以比較簡單的實現和其他外部容器的集成以及更加自如的控制classloader,:)
    在解決了classloader的問題后,通常來講,使用OSGi帶給你的更多的就是享受,而非痛苦了。

    posted on 2009-05-21 13:42 BlueDavy 閱讀(5950) 評論(0)  編輯  收藏 所屬分類: OSGi、SOA、SCA

    公告

     









    feedsky
    抓蝦
    google reader
    鮮果

    導航

    <2009年5月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    統計

    隨筆分類

    隨筆檔案

    文章檔案

    Blogger's

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产亚洲福利在线视频| www免费黄色网| 亚洲五月午夜免费在线视频| 成全视频高清免费观看电视剧| 亚洲a∨无码男人的天堂| xvideos亚洲永久网址| 91香蕉国产线在线观看免费| 亚洲精品久久无码av片俺去也| 亚洲精品午夜无码电影网| 67194成是人免费无码| av永久免费网站在线观看 | 亚洲中文字幕在线无码一区二区| 在线免费观看一区二区三区| a级毛片毛片免费观看久潮喷| 亚洲av无码久久忘忧草| 亚洲人成无码网站| 日韩成全视频观看免费观看高清| 日韩免费电影网站| 日日摸日日碰夜夜爽亚洲| 亚洲色偷偷偷网站色偷一区| 亚洲综合另类小说色区色噜噜| 国产精品69白浆在线观看免费| 拍拍拍无挡免费视频网站| 亚洲AV日韩综合一区| 亚洲第一成年人网站| 亚洲日韩激情无码一区| 国产免费私拍一区二区三区| 免费能直接在线观看黄的视频 | 午夜时刻免费入口| 久久精品无码专区免费青青| 亚洲免费无码在线| 国产亚洲视频在线| 亚洲综合无码无在线观看| 亚洲午夜精品一区二区| 亚洲真人无码永久在线| 哒哒哒免费视频观看在线www | 妞干网免费视频观看| **aaaaa毛片免费同男同女| 精品视频在线免费观看| 国产精品永久免费| 国产精品福利在线观看免费不卡|