什麼是重複/循環引用java
簡單說,重複引用就是一個集合/對象中的多個元素/屬性同時引用同一對象,循環引用就是集合/對象中的多個元素/屬性存在相互引用致使循環。spring
舉例說明json
重複引用編碼
循環引用spa
暫時不說重複引用,單說循環引用。
通常來講,存在循環引用問題的集合/對象在序列化時(好比Json化),若是不加以處理,會觸發StackOverflowError異常。對象
分析緣由:get
首先,fastjson做爲一款序列化引擎,不可避免的會遇到循環引用的問題,爲了不StackOverflowError異常,fastjson會對引用進行檢測。table
若是檢測到存在重複/循環引用的狀況,fastjson默認會以「引用標識」代替同一對象,而非繼續循環解析致使StackOverflowError。ast
以上文兩例說明,查看json化後的輸出object
重複引用 JSON.toJSONString(list)
2.循環引用 JSON.toJSONString(map1)
引用標識說明:
「$ref」:」..」 上一級
「$ref」:」@」 當前對象,也就是自引用
「$ref」:」$」 根對象
「$ref」:」$.children.0」 基於路徑的引用,至關於root.getChildren().get(0)
1 |
JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect); |
FastJson提供了SerializerFeature.DisableCircularReferenceDetect這個序列化選項,用來關閉引用檢測。關閉引用檢測後,重複引用對象時就不會被$ref代替,可是在循環引用時也會致使StackOverflowError異常。
重複引用
1 2 3 4 5 6 7 8 |
List<Object> list = new ArrayList<>(); Object obj = new Object(); list.add(obj); // 建立新的對象 Object newObj = new Object(); // 使用org.springframework.beans.BeansUtils複製屬性值 BeansUtils.copy(obj, newObj); list.add(obj); |
循環引用 循環引用這種邏輯自己就不合理,須要在編碼時注意避免,這是邏輯錯誤而非編碼技巧。