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

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

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

    Coundy

       漫步風中,傾聽自己的腳步,在自我沉浸中,找尋逝去的靈魂

    posts - 27,comments - 2,trackbacks - 0
    問題:Struts2框架的rest-plugin插件中jsonlib庫,在序列化時因對象循環引用時觸發異常。為了在解決這個問題,修改該插件的源代碼并重發編譯。
    思路:解決這個問題,用了一個簡單的思路,就是將jsonlib序列化前,先將循環引用解除,在代碼中使用遞歸和堆棧。
    缺失:由于該方式采用如果存在循環引用就返回null值的方式,因此這種方式不具反序列化可行性,需要進一步改進思路。
    參考:目前開源的fastjson已經解決了對象循環引用問題
    // 處理數組的循環引用
    private Object disCycleArray(Object obj, Object owner)
    throws IllegalArgumentException, IllegalAccessException {
    if (null != obj) {
    if (!isRefObject(getComponetType(obj)))
    return obj;
    Object[] objects = (obj instanceof Collection) ? ((Collection) obj)
    .toArray() : ((Object[]) obj);
    for (int i = 0; i < objects.length; i++) {
    objects[i] = disCycleObject(objects[i], owner);
    }
    if (obj instanceof Collection) {
    Set collection = new HashSet();
    CollectionUtils.addAll(collection, objects);
    return collection;
    }
    return objects;
    }
    return null;
    }
    private Object disCycleObject(Object obj, Object owner)
    throws IllegalArgumentException, IllegalAccessException {
    if (null == obj)
    return null;
    else if (null == owner || obj == owner) {
    roots.put(obj.hashCode(), obj);
    } else {
    if (!contains(roots, owner)) {
    roots.put(owner.hashCode(), owner);
    }
    if (contains(roots, obj))
    return null;
    }
    if (null != obj) {
    Field[] fields = obj.getClass().getDeclaredFields();
    for (Field f : fields) {
    f.setAccessible(true);
    Object value = f.get(obj);
    if (null != value && !"".equals(value))
    if (isArray(value)) {
    Object newvalue = disCycleArray(value, obj);
    f.set(obj, newvalue);
    } else {
    if (isRefObject(f.getType())) {
    if (contains(roots, value)) {
    f.set(obj, null);
    } else {
    Object newvalue = disCycleObject(value, obj);
    f.set(obj, newvalue);
    }
    }
    }
    }
    //roots.remove(obj.getClass().getName());
    roots.remove(obj.hashCode());
    return obj;
    }
    return null;
    }
    private Class getComponetType(Object obj) {
    if (null != obj) {
    if (isArray(obj)) {
    Object[] objects = (obj instanceof Collection) ? ((Collection) obj)
    .toArray() : ((Object[]) obj);
    return objects.length > 0 ? (objects[0] == null ? null
    : objects[0].getClass()) : null;
    }
    }
    return null;
    }
    private boolean isRefObject(Class<?> clz) {
    if (null != clz)
    if (!clz.isPrimitive()
    && !clz.getName().startsWith("java.util")
    && !clz.getName().matches(
    "java.lang.(?!\\bObject\\b$)\\S+$")
    && !clz.getName().startsWith("java.io")) {
    return true;
    }
    return false;
    }
    private boolean contains(Map<Integer, Object> roots, Object obj) {
    if (null != obj) {
    Object target = roots.get(obj.hashCode());
    if (null != target) {
    return true;
    }
    }
    return false;
    }
    private boolean isArray(Object obj) {
    return obj instanceof Collection || obj.getClass().isArray();
    }
    posted on 2013-03-27 11:46 Coundy 閱讀(511) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲国产精品日韩在线| 国产亚洲色婷婷久久99精品| 亚洲永久中文字幕在线| 免费国产成人18在线观看| 亚洲熟妇av一区二区三区| 精品国产福利尤物免费| 中文字幕亚洲专区| 美女在线视频观看影院免费天天看| 全亚洲最新黄色特级网站 | 亚洲va久久久久| 永久免费av无码网站韩国毛片| 亚洲一区电影在线观看| h视频在线观看免费完整版| 亚洲人成人77777网站不卡| 无码免费午夜福利片在线 | 理论亚洲区美一区二区三区 | 天堂在线免费观看中文版| 亚洲色大成网站www尤物| 国产a不卡片精品免费观看 | 久久国产精品免费视频| 亚洲国产精品午夜电影| 国内自产少妇自拍区免费| 羞羞网站免费观看| 在线亚洲97se亚洲综合在线| 久久国产精品免费网站| 亚洲制服丝袜中文字幕| 暖暖在线日本免费中文| eeuss影院www天堂免费| 亚洲熟妇中文字幕五十中出| 37pao成人国产永久免费视频| 午夜在线a亚洲v天堂网2019| 无码欧精品亚洲日韩一区夜夜嗨| 99免费在线视频| 亚洲一区免费视频| 亚洲av区一区二区三| 久久免费福利视频| 亚洲一线产区二线产区区| 亚洲午夜久久久久久噜噜噜| av无码久久久久不卡免费网站| 激情吃奶吻胸免费视频xxxx| 久久精品国产亚洲AV网站|