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

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


    網站導航:
     
    主站蜘蛛池模板: 国产a v无码专区亚洲av| 亚洲精品蜜夜内射| 国产乱辈通伦影片在线播放亚洲| 国产精品亚洲一区二区三区在线观看| 亚洲国产最大av| 国产成人久久精品亚洲小说| 无码国产精品一区二区免费虚拟VR| 又爽又黄无遮挡高清免费视频 | 视频免费在线观看| 国产国拍精品亚洲AV片| 三年在线观看免费观看完整版中文 | 亚洲精品天堂在线观看| 中国一级特黄的片子免费| 亚洲精品自在在线观看| 未满十八18禁止免费无码网站| 亚洲日韩国产精品无码av| 成年轻人网站色免费看| 日韩色视频一区二区三区亚洲| 亚洲Aⅴ无码一区二区二三区软件| 亚洲阿v天堂在线2017免费| 成人免费无遮挡无码黄漫视频| 亚洲日韩精品无码专区加勒比☆| 国产在线19禁免费观看国产| 一级毛片免费不卡| 亚洲国产综合第一精品小说| 免费看AV毛片一区二区三区| a级毛片免费观看在线| 亚洲国产精品久久久久婷婷软件| 在线观看av永久免费| 亚洲综合无码一区二区三区| 成年美女黄网站18禁免费| 永久免费无码网站在线观看个| 亚洲免费在线视频| 日韩一区二区在线免费观看 | 免费a级毛片无码a∨蜜芽试看| 亚洲欧美熟妇综合久久久久| 国产亚洲美日韩AV中文字幕无码成人| 99视频免费播放| 在线观看亚洲视频| 亚洲高清在线mv| 国产黄色一级毛片亚洲黄片大全|