<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)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 免费毛片在线看片免费丝瓜视频 | 亚洲国产精品综合久久20| 亚洲一二成人精品区| 免费人成视频在线观看免费| 一二三四免费观看在线电影 | 无码亚洲成a人在线观看| 青娱乐免费在线视频| 亚洲欧洲日本天天堂在线观看| 亚洲精品免费视频| 亚洲电影一区二区三区| 午夜精品射精入后重之免费观看 | 91亚洲国产成人精品下载| 成人国产精品免费视频| 亚洲精品乱码久久久久久自慰| 中文字幕不卡高清免费| 亚洲国产精品va在线播放| 91视频国产免费| 91亚洲国产成人久久精品网址| 久久久久久久免费视频| 亚洲熟女乱色一区二区三区| 国产成人免费福利网站| 国产VA免费精品高清在线| 久久综合日韩亚洲精品色| 西西大胆无码视频免费| 国产精品亚洲综合| 亚洲一区无码中文字幕| 1000部拍拍拍18勿入免费视频下载 | 人妻18毛片a级毛片免费看| 情人伊人久久综合亚洲| 1000部拍拍拍18勿入免费视频下载| 亚洲中文字幕无码mv| 亚洲欧洲精品成人久久奇米网 | 亚洲精品自拍视频| 日韩a级毛片免费观看| 二个人看的www免费视频| 亚洲色成人网一二三区| 国产福利免费在线观看| 久久成人免费电影| 亚洲国产成人久久精品大牛影视| 国产亚洲av片在线观看18女人| 亚洲成人免费电影|