這個問題可能是你的SYSTEM_AUDIT_SHEET
要麼包含引用SYSTEM_AUDIT_SHEET
類型的實例的屬性,或者它包含一個指向具有指針SYSTEM_AUDIT_SHEET
實例對象的屬性。序列化這樣一個指針循環會導致一個永遠不會結束的序列化過程。
您需要將您的SYSTEM_AUDIT_SHEET
轉換爲在序列化之前不會(直接或間接)引用自身的類型。你可以創建一個全新的類型,並編寫代碼來實例化你的類型SYSTEM_AUDIT_SHEET
(AutoMapper可能在這裏派上用場)。但是,我往往會發現,在大多數情況下,很容易,只需使用匿名類型:如果你想使用AutoMapper和假設
SYSTEM_AUDIT_SHEET sheet = /*some sheet*/
var json = new {
sheet.Id,
sheet.RevisionNumber,
sheet.Title
};
return serializer.Serialize(json);
編輯
,你的表看起來像
class SYSTEM_AUDIT_SHEET
{
public int Id { get; set; }
public SYSTEM_AUDIT_SHEET SomeOtherAuditSheet { get;set;}
public string Title { get;set;}
}
你可以創建一個類型像
class JSON_SYSTEM_AUDIT_SHEET
{
public int Id { get; set; }
public int SomeOtherAuditSheetsId { get;set;}
public string Title { get;set;}
}
應用程序啓動時(比如說,在的Application_Start)配置AutoMapper:
AutoMapper.Mapper.CreateMap<SYSTEM_AUDIT_SHEET, JSON_SYSTEM_AUDIT_SHEET>()
.ForMember(dest => dest.SomeOtherAuditSheetsId, opt => opt.MapFrom(src => src.SomeOtherAuditSheet.Id));
的Id
和Title
屬性將直接對面SYSTEM_AUDIT_SHEET
被映射到JSON_SYSTEM_AUDIT_SHEET
因爲他們有兩種類型相同的名稱。屬性SomeOtherAuditSheetsId
需要特殊配置,因爲在源類型中沒有具有該確切名稱的屬性。
當你要轉換SYSTEM_AUDIT_SHEET到JSON_SYSTEM_AUDIT_SHEET你做:
return AutoMapper.Mapper.Map<SYSTEM_AUDIT_SHEET , JSON_SYSTEM_AUDIT_SHEET >(sheet);
你可能想看看AutoMapper's flattening features。
希望這會有所幫助。
創建一個新類,類似於要序列化的對象,但沒有循環引用。從表單對象填充該類中的數據並對其進行序列化。由於這種問題,直接序列化實體框架對象是一種不好的做法。 – Birey
重複的問題;答案是「使用JSON.Net」,它有幾個解決方案,這個問題沒有複製/粘貼類。 http://stackoverflow.com/questions/4606232/circular-reference-exception-with-json-serialisation-with-mvc3-and-ef4-ctp5w –