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

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


    網站導航:
     
    主站蜘蛛池模板: 久久亚洲免费视频| 国产成人精品亚洲精品| 亚洲第一香蕉视频| 四虎影视成人永久免费观看视频 | 无忧传媒视频免费观看入口| 日本一道本高清免费| MM1313亚洲精品无码久久| 日韩成人在线免费视频| 国产亚洲精品美女| 亚洲爽爽一区二区三区| 中文字幕不卡免费视频| 亚洲AV综合色区无码另类小说| 国产在线精品免费aaa片| 日产亚洲一区二区三区| 国产一卡二卡四卡免费| 亚洲色偷精品一区二区三区 | 久久久久无码专区亚洲av | 久视频精品免费观看99| 久久精品国产亚洲AV蜜臀色欲 | 久久成人免费大片| 亚洲欧洲日韩在线电影| 最近中文字幕无吗高清免费视频| 亚洲AV女人18毛片水真多| 亚洲人成无码网WWW| 成人久久免费网站| 亚洲乱码一二三四五六区| 天天天欲色欲色WWW免费| 男人和女人高潮免费网站| 久久亚洲精品成人| 最近2019中文字幕免费看最新| 美女无遮挡免费视频网站| 亚洲精品狼友在线播放| 1000部国产成人免费视频| 美女18一级毛片免费看| 亚洲欧洲在线观看| 国产免费观看a大片的网站| 精品免费tv久久久久久久| 亚洲人成www在线播放| 久久久久亚洲AV综合波多野结衣 | 美女视频黄频a免费观看| 亚洲嫩模在线观看|