我的模型类循环引用的样子如下:处理与Newtonsoft JSON
public class ModelType
{
public string Name { get; set; }
public ModelType SuperType { get; set }
public IEnumerable<ModelType> SubTypes { get; set; }
}
我试图序列化对象,但得到StackOverflowException
。我曾试着打电话给
JsonConvert.SerializeObject(model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
以及
JsonConvert.SerializeObject(model, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });
两个调用导致StackOverflowException
。任何想法如何序列化ModelType
实例?
EDIT:
实例的实施例,从而未能序列:
{
Name: "Child",
SuperType: {
Name: "Parent",
SuperType: null,
SubTypes: [{
Name: "Child",
SuperType: {
Name: "Parent",
SuperType: null,
SubTypes: [{Name: "Child", ...}]
},
SubTypes: []
}]
},
SubTypes: []
}
EDIT2:
通过进一步寻找到的问题(如所有SO Q &甲,设置要么ReferenceLoopHandling.Ignore
或PreserveReferencesHandling.Objects
应该工作)我已经发现,
- 儿童是唯一的对象实例
- Child.SuperType(父)是唯一的对象实例
- Child.SuperType.SubTypes [0](儿童)是唯一的对象实例,而不是(1参考。 )
- Child.SuperType.SubTypes [0] .SuperType(母公司)是独一无二的对象实例,而不是(2)
- 等等的参考...
我认为,出事在对象期间错误c反应(从我的代码中),并创建了无限的对象链。我不确定这是否可以仅由JsonSerializerSettings
来处理。
添加了填充对象的示例。 – mimo
你有一个完整的C#repro,编译的东西。 –
@Simon Mourier,我很抱歉,但不能提供编译的代码,它太复杂了(通过实体框架 - >获取数据实体 - >转移到商业实体)。但我认为我找到了根本原因。当数据实体被转换为业务实体时,通过Lync查询设置SuperType和SubTypes的属性来创建这个无限链,这将在序列化时进行评估。 – mimo