循环引用防止对象图的序列化

我有一个涉及杂草和杂草家庭的简单数据模型。

WeedFamily Weed (WeedFamily和Weed有一对多的关系)

我正在尝试完成我的第一个ApiController,以便我可以轻松地将我的数据检索为AngularJS应用程序的JSON。 当我在我的应用程序中访问/WeedAPI/ URL时,出现以下错误。 我很确定问题是我在WeedWeedFamily之间有循环引用。

我应该如何更改我的数据模型,以便JSON序列化能够在保持WeedWeedFamily关系的双向质量的同时WeedFamily

(即我仍然希望能够构建如下表达式:

  WeedData.GetFamilies()["mustard"].Weeds.Count 

 WeedData.GetWeeds()[3].Family.Weeds 

错误:

  An error has occurred.  The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'.  System.InvalidOperationException   An error has occurred.  Object graph for type 'WeedCards.Models.WeedFamily' contains cycles and cannot be serialized if reference tracking is disabled.   System.Runtime.Serialization.SerializationException   at System.Runtime.Serialization.XmlObjectSerializerWriteContext.OnHandleReference(XmlWriterDelegator xmlWriter, Object obj, Boolean canContainCyclicReference) at WriteWeedToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , ClassDataContract ) at System.Runtime.Serialization.ClassDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDecl...etc    

我的数据:

 public class WeedData { public static Dictionary GetFamilies(){ return new Dictionary { {"mustard",new WeedFamily("Mustard","Brassicaceae")} ,{"pigweed",new WeedFamily("Pigweed","Amaranthus")} ,{"sunflower",new WeedFamily("Sunflower","Asteraceae")} }; } public static List GetWeeds(){ var Families = GetFamilies(); return new List { new Weed("Hairy Bittercress","Cardamine hirsuta",Families["mustard"]) ,new Weed("Little Bittercress","Cardamine oligosperma",Families["mustard"]) ,new Weed("Shepherd's-Purse","Capsella bursa-pastoris",Families["mustard"]) ,new Weed("Wild Mustard","Sinapis arvensis / Brassica kaber",Families["mustard"]) ,new Weed("Wild Radish","Raphanus raphanistrum",Families["mustard"]) ,new Weed("Radish","Raphanus sativus",Families["mustard"]) ,new Weed("Redroot Pigweed","Amaranthus retroflexus",Families["pigweed"]) ,new Weed("Prickly Lettuce","Lactuca serriola",Families["sunflower"]) ,new Weed("Spiny Sowthistle","Sonchus asper",Families["sunflower"]) ,new Weed("Annual Sowthistle","Sonchus oleraceus",Families["sunflower"]) }; } } 

我的模型类:

 [Serializable] public class Weed { public string CommonName; public string LatinName; public List Photos; public WeedFamily Family; public Weed(string commonName, string latinName) { CommonName = commonName; LatinName = latinName; } public Weed(string commonName, string latinName, WeedFamily family) { CommonName = commonName; LatinName = latinName; Family = family; Family.Weeds.Add(this); } override public string ToString() { return CommonName + " (" + LatinName + ")"; } } 

 [Serializable] public class WeedFamily { public string CommonName; public string LatinName; public List Weeds; public WeedFamily(string commonName, string latinName) { CommonName = commonName; LatinName = latinName; Weeds = new List(); } } 

最后,ApiController:

 public class WeedAPIController : ApiController { // // GET: /WeedAPI/ public IEnumerable GetAllWeeds() { return WeedData.GetWeeds(); } } 

[DataContract(IsReference = true)]到具有循环引用的对象。

 [Serializable] [DataContract(IsReference = true)] public class WeedFamily [Serializable] [DataContract(IsReference = true)] public class Weed 

请参阅http://msdn.microsoft.com/en-us/library/vstudio/hh241056(v=vs.100).aspx