2012-03-16 46 views
0

我想序列化一些對象到Json中。有時(並不總是,我不知道是什麼觸發它)這些對象中的一個是代理,即使沒有循環引用,也會導致序列化程序發出循環引用錯誤:「在序列化一個循環引用時檢測到循環引用「System.Reflection.RuntimeModule」類型的對象。「如何打開de-proxy對象,以便將它們序列化爲Json?

我的代碼使用NHibernate和JavaScriptSerializer:

public static string Convert(object xiObject) 
{ 
    var lSerialiser = new JavaScriptSerializer(); 

    return lSerialiser.Serialize(xiObject); 
} 

延遲加載理應關閉,如:

HasManyToMany(x => x.Managers) 
    .Not.LazyLoad(); 

這聽起來很相似,這傢伙的問題: http://markmail.org/message/x5a2k7j7qtjmj73g#query:+page:1+mid:4r5lcggmfrcq5tby+state:results

所以我的計劃是使用Json.net而不是JavaScriptSerializer,並在該頁面上實現解決方案,但看起來確實比較複雜licated。任何其他建議都會很棒。

回答

0

也許你可以在序列化它之前「unproxy」對象。本文展示瞭如何做到這一點 - Identifying NHibernate proxy classes

+0

謝謝 - 此鏈接做到了:http://sessionfactory.blogspot.co.uk/2010/08/hacking-lazy-loaded-inheritance.html – JYX 2012-03-19 11:35:16

0

恕我直言,正確的答案是「你不要」。
您的實體(可能包含代理)屬於您的業務域。您應該序列化DTO,其中只包含您的客戶需要的內容,不能再包含其他內容。
Ayende writes about it in detail

P.S.它也被認爲是最佳實踐而不是來設置您的映射中的延遲加載參數,而是根據您正在執行的特定查詢來決定是否延遲加載。再次,Ayende explains