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

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


    網站導航:
     
    主站蜘蛛池模板: 免费在线观看的黄色网址| 亚洲va久久久噜噜噜久久 | 九一在线完整视频免费观看| 国产亚洲AV手机在线观看| 99精品热线在线观看免费视频| 亚洲一区二区三区91| 亚洲高清视频一视频二视频三| 中文字幕无码免费久久| 亚洲中文字幕久久精品蜜桃 | 亚洲视频中文字幕| 天天干在线免费视频| 成全视成人免费观看在线看| 99久久婷婷国产综合亚洲| 亚洲最大AV网站在线观看| 美女视频黄是免费的网址| 久久一区二区免费播放| 国产成人精品日本亚洲专区6| 亚洲中文字幕无码专区| 久久WWW免费人成人片| a级片免费在线播放| 亚洲成a人无码亚洲成av无码 | va亚洲va日韩不卡在线观看| 84pao国产成视频免费播放| 无码的免费不卡毛片视频| 亚洲一本之道高清乱码| 亚洲精品一品区二品区三品区| 成人免费视频88| 222www在线观看免费| 国产无限免费观看黄网站| www亚洲精品久久久乳| 亚洲无成人网77777| 亚洲国产精品特色大片观看完整版 | 亚洲日韩中文在线精品第一| 在线观看AV片永久免费| 久久久久免费看黄a级试看| 日本视频免费观看| 亚洲AV无码之国产精品| 亚洲av成人综合网| 亚洲电影唐人社一区二区| 亚洲av无码一区二区三区不卡 | 日本免费人成视频在线观看|