迴圈引用導致的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
- iOS迴圈引用iOS
- 解決NSTimer迴圈引用導致記憶體洩漏的六種方法記憶體
- Python迴圈引用是什麼?如何避免迴圈引用?Python
- 故障分析 | DDL 導致的 Xtrabackup 備份失敗
- 獲取導致匯入失敗的資料
- 解決迴圈引用
- ios 避免迴圈引用iOS
- Filestream/Windows Share導致Alwayson Failover失敗WindowsAI
- springboot衝突導致的發版失敗Spring Boot
- sock鎖檔案導致的MySQL啟動失敗MySql
- 獲取導致匯入失敗的資料(五)
- 獲取導致匯入失敗的資料(四)
- 獲取導致匯入失敗的資料(三)
- 獲取導致匯入失敗的資料(二)
- 糟糕的範圍管理導致專案失敗(轉)
- 理解 ARC 下的迴圈引用
- Json 序列化、反序列化;重複或迴圈使用時注意事項JSON
- 源設定導致Docker映象構建失敗Docker
- stream pool設定過小導致impdp失敗
- selinux導致sqlplus登入失敗LinuxSQL
- require()迴圈引用問題UI
- rman備份的時候讀取v$session_longops失敗導致備份失敗SessionGo
- 如何解決使用JSON.stringify時遇到的迴圈引用問題JSON
- Docker 導致阿里雲 ECS 內網互通失敗Docker阿里內網
- 企業使用ERP系統導致失敗的因素所在
- ORACLE 分割槽索引UNUSABLE導致的DML操作失敗引起的血案Oracle索引
- FastJson中迴圈引用的問題ASTJSON
- 儲存互斥失敗導致資料丟失的資料恢復成功案例資料恢復
- Swift中的迴圈強引用 【使用無主引用解決】Swift
- MongoDB例項重啟失敗探究(大事務Redo導致)MongoDB
- 誤操作經歷,truncate導致閃回查詢失敗
- ROSE HA切換節點導致DG失敗、恢復ROS
- DML_LOCKS設定為0導致SHUTDOWN IMMEDIATE失敗
- 邦芒面試:導致面試失敗最關鍵的3種原因面試