迴圈引用導致的json序列化失敗
問題
昨天在給系統加日誌後,系統就一直報 Stack Overflow錯誤,找了很久才發現問題,引入的日誌工具使用 gson序列化,而列印的日誌物件裡包含迴圈引用,導致出錯。
簡單復現
/**
* ClassName: SerializeModel <br/>
* Function: 迴圈引用序列化<br/>
* 迴圈引用:包括自迴圈,如本類和A、B互相引用 (感覺都是類設計的不好啊)
*
* stackOverflowError分析原因:當序列化引擎解析A時,它發現這個物件持有一個B的引用,轉而去解析B。解析B時,發現他又持有A的引用,又轉回A。如此產生StackOverflowError異常。
*
* @author gary.liu
* @date 2018/9/23
*/
public class SerializeModel {
private int id;
private List<SerializeModel> models;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List<SerializeModel> getModels() {
return models;
}
public void setModels(List<SerializeModel> models) {
this.models = models;
}
public String toString(){
return ToStringBuilder.reflectionToString(this);
}
public static void main(String[] args) {
List<SerializeModel> models = Lists.newArrayList();
SerializeModel model = new SerializeModel();
model.setId(1);
models.add(model);
model.setModels(models);
System.out.println(ToStringBuilder.reflectionToString(model));
System.out.println(JSON.toJSONString(model));
System.out.println(JSON.toJSONString(ToStringBuilder.reflectionToString(model)));
//下面會報stackoverflow error
System.out.println(new Gson().toJson(model));
System.out.println(JSON.toJSON(model));
System.out.println(JSON.toJSONString(model, SerializerFeature.DisableCircularReferenceDetect));
}
}
解決辦法
由於我只是想列印日誌,所以就只想到下面兩個辦法:
- 使用 ToStringBuilder.reflectionToString
- 使用 fastjson 的 JSON.toJSONString ,fastjson會預設迴圈引用處理成 $ref,不會報錯
相關文章
- ARC下的block導致的迴圈引用問題解析BloC
- 如何在ASP.NET Core中避免JSON序列化的迴圈引用(連結)ASP.NETJSON
- 匿名內部類方式構建物件導致序列化失敗物件
- 如何在 Swift 中優雅的處理閉包導致的迴圈引用Swift
- 解決NSTimer迴圈引用導致記憶體洩漏的六種方法記憶體
- 迴圈引用
- springboot衝突導致的發版失敗Spring Boot
- Python迴圈引用是什麼?如何避免迴圈引用?Python
- 故障分析 | DDL 導致的 Xtrabackup 備份失敗
- iOS迴圈引用iOS
- sock鎖檔案導致的MySQL啟動失敗MySql
- 如何解決使用JSON.stringify時遇到的迴圈引用問題JSON
- Json 序列化、反序列化;重複或迴圈使用時注意事項JSON
- 解決迴圈引用
- rman備份的時候讀取v$session_longops失敗導致備份失敗SessionGo
- Docker 導致阿里雲 ECS 內網互通失敗Docker阿里內網
- 企業使用ERP系統導致失敗的因素所在
- require()迴圈引用問題UI
- FastJson中迴圈引用的問題ASTJSON
- iOS 關於NSTimer的迴圈引用iOS
- ORACLE 分割槽索引UNUSABLE導致的DML操作失敗引起的血案Oracle索引
- 儲存互斥失敗導致資料丟失的資料恢復成功案例資料恢復
- MongoDB例項重啟失敗探究(大事務Redo導致)MongoDB
- Spring如何解決迴圈引用Spring
- TP 框架解析 JSON 失敗原因框架JSON
- win10自動修復失敗無限迴圈怎麼辦_win10開機自動修復失敗無限迴圈如何解決Win10
- selenium-java被檢測導致滑塊驗證失敗Java
- Block迴圈引用的三種解決方式BloC
- NSTimer迴圈引用的幾種解決方案
- JavaScript 深複製的迴圈引用問題JavaScript
- 怎麼解決引用計數 GC 的迴圈引用問題?GC
- [NG] 考古 - HttpInterceptor 迴圈引用錯誤HTTP
- SpringBoot 迴圈引用解決辦法Spring Boot
- Drone構建失敗,一次drone依賴下載超時導致構建失敗的爬坑記錄
- 使用CDN導致301跳轉失敗(主域名、泛解析)的解決方案
- 邦芒面試:導致面試失敗最關鍵的3種原因面試
- 開啟 Keep-Alive 可能會導致http 請求偶發失敗Keep-AliveHTTP
- wait_type SOS_WORKER導致資料庫連線失敗AI資料庫