gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:30:03 25 4
gpt4 key购买 nike

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

WeedFamily <-1---*-> Weed (WeedFamily和Weed是一对多的关系)

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

我应该如何更改我的数据模型,以便 JSON 序列化工作,同时保持 Weed 的双向质量? - WeedFamily关系?

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

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

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

)

错误:

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'.
</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace/>
<InnerException>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Object graph for type 'WeedCards.Models.WeedFamily' contains cycles and cannot be serialized if reference tracking is disabled.
</ExceptionMessage>
<ExceptionType>
System.Runtime.Serialization.SerializationException
</ExceptionType>
<StackTrace>
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
</StackTrace>
</InnerException>
</Error>

我的数据:

public class WeedData
{
public static Dictionary<string,WeedFamily> GetFamilies(){
return new Dictionary<string,WeedFamily>
{
{"mustard",new WeedFamily("Mustard","Brassicaceae")}
,{"pigweed",new WeedFamily("Pigweed","Amaranthus")}
,{"sunflower",new WeedFamily("Sunflower","Asteraceae")}
};
}

public static List<Weed> GetWeeds(){
var Families = GetFamilies();
return new List<Weed>
{
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<WeedPhoto> 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<Weed> Weeds;

public WeedFamily(string commonName, string latinName)
{
CommonName = commonName;
LatinName = latinName;
Weeds = new List<Weed>();
}
}

最后,ApiController:

public class WeedAPIController : ApiController
{
//
// GET: /WeedAPI/

public IEnumerable<Weed> 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

关于c# - 防止对象图序列化的循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18392402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com