2013-05-09 86 views
3

我想在JSON.NET中序列化一個對象圖,其中一個Galaxy包含StarSystems,一個StarSystem包含行星,一個Planet包含一個殖民地,一個殖民地有一個所有者,而銀河也有一個帝國列表,每個列表都有一個探索過的StarSystems列表。所以StarSystem,Planet和Empire之間有一個循環參考。JSON.NET靜靜地忽略循環引用,並設置鏈中的任意鏈接爲null來解決它們

我不明白的是我在序列化對象圖時得到的行爲。當我將參考循環處理設置爲默認值時,而不是在將參考循環處理設置爲默認值時嘗試序列化所有內容,而不是在將其設置爲序列化模式時將所有內容序列化,這似乎是序列化鏈中的幾個鏈接,然後放棄並設置任意值(在我的情況下,探索明星系統)爲空。當然,這會在應用程序的其他地方導致崩潰,當它尋找星系時,只會發現空值!

這可能與鏈中的一些鏈接不是直接引用而是集合有關嗎?例如。一個帝國沒有一個探索過的星系,而是一個列表。

那麼我該如何讓JSON.NET序列化一切?我是否需要消除循環引用,並在對象模型中傳遞ID的對象而不是實際的對象引用?我真的不想爲了序列化目的而這麼做!

+1

你有一些代碼嗎? – 2013-05-10 00:32:59

+0

JSON.NET應該沒有任何問題序列化任何對象圖(或正確恢復它)。很可能你的代碼被破壞(例如,通過在屬性設置器中做出意想不到的事情)。發佈一些代碼.. – 2013-05-10 00:43:05

+0

不確定什麼代碼會有用 - 當我調用序列化程序時的代碼?還有別的嗎? (如果我不保存並重新加載遊戲,只是在內存中工作,一切都很正常。) – ekolis 2013-05-10 07:13:41

回答

0

不知道我是如何做到這一點的,但現在看起來我只是將null添加到已探索星系的列表中,而不是替換探索星系的列表,所以我可以將其過濾掉。對不起,我沒有任何線索可以解決這個問題!

+0

現在我再次得到普通的空值。這完全是隨機的。 – ekolis 2013-05-10 07:40:16

+0

其實不是隨機的。當明星系統通過JSON從帝國引用而不是包含在帝國之內時,它似乎遇到了麻煩。 – ekolis 2013-05-10 07:43:35

1

我想出了一個解決方法。而不是每個帝國存儲一個探索明星系統列表,每個明星系統將存儲已經探索它的帝國列表。這樣,沒有循環引用!