Xml DataContractSerializer引发堆栈溢出

Xml DataContractSerializer引发堆栈溢出,xml,.net-core,stack-overflow,datacontractserializer,Xml,.net Core,Stack Overflow,Datacontractserializer,我想将一个类序列化为XML文件。我的类有包含许多循环引用的子类,为此我使用DataContractSerializer。在所有类上,都设置了属性IsReferenze=true 不幸的是,在序列化时,我总是遇到stackoverflow异常。我是否必须注意DataContractSerializer中的某些内容,还是仅仅通过许多循环引用和列表来达到它的极限?它对一些条目有效,但在一定数量之后就不再有效了 例如: [DataContract(IsReference = true)] public

我想将一个类序列化为XML文件。我的类有包含许多循环引用的子类,为此我使用DataContractSerializer。在所有类上,都设置了属性IsReferenze=true

不幸的是,在序列化时,我总是遇到stackoverflow异常。我是否必须注意DataContractSerializer中的某些内容,还是仅仅通过许多循环引用和列表来达到它的极限?它对一些条目有效,但在一定数量之后就不再有效了

例如:

[DataContract(IsReference = true)]
public class ParentClass
{
    [DataMember] public ConcurrentDictionary<string, A> Dict{ get; set; } = new ConcurrentDictionary<string, A>();
    [DataMember] public List<B> List1 { get; set; } = new List<B>();
    [DataMember] public List<B> List2 { get; set; } = new List<B>();
    [DataMember] public List<B> List3 { get; set; } = new List<B>();
    [DataMember] public List<B> List4 { get; set; } = new List<B>();
    [DataMember] public List<B> List5 { get; set; } = new List<B>();
    [DataMember] public List<C> List6 { get; set; } = new List<C>();
    [DataMember] public List<C> List7 { get; set; } = new List<C>();
    [DataMember] public List<C> List8 { get; set; } = new List<C>();
}

[DataContract(IsReference=true)]
public class A
{
    [DataMember] public string Text { get; set; }
    [DataMember] public List<B> List1 { get; set; } = new List<B>();
    [DataMember] public List<B> List2 { get; set; } = new List<B>();
    [DataMember] public List<B> List3 { get; set; } = new List<B>();
    [DataMember] public List<B> List4 { get; set; } = new List<B>();
    [DataMember] public List<C> List5 { get; set; } = new List<C>();
}

[DataContract(IsReference=true)]
public class B
{
    [DataMember] public List<A> List1 { get; set; } = new List<A>();
    [DataMember] public List<string> List2 { get; set; } = new List<string>();
    [DataMember] public List<B> List3 { get; set; } = new List<B>();
    [DataMember] public List<B> List4 { get; set; } = new List<B>();

}

[DataContract(IsReference=true)]
public class C
{
    [DataMember] public string Id { get; set; }
    [DataMember] public string Text { get; set; }
    [DataMember] public List<B> List1 { get; set; } = new List<B>();
    [DataMember] public List<B> List2 { get; set; } = new List<B>();
    [DataMember] public List<C> List3 { get; set; } = new List<C>();
}


private void Serialize()
{            
    var ds = new DataContractSerializer(typeof(ParentClass));
    var settings = new XmlWriterSettings { Indent = true };

    using (var w = XmlWriter.Create(@"test.xml", settings))
    {
        ds.WriteObject(w, ParentClassObject);          
    }
}
[DataContract(IsReference=true)]
公共类父类
{
[DataMember]公共ConcurrentDictionary Dict{get;set;}=new ConcurrentDictionary();
[DataMember]公共列表列表1{get;set;}=new List();
[DataMember]公共列表列表2{get;set;}=new List();
[DataMember]公共列表List3{get;set;}=new List();
[DataMember]公共列表列表4{get;set;}=new List();
[DataMember]公共列表列表5{get;set;}=new List();
[DataMember]公共列表列表6{get;set;}=new List();
[DataMember]公共列表List7{get;set;}=new List();
[DataMember]公共列表列表8{get;set;}=new List();
}
[DataContract(IsReference=true)]
公共A类
{
[DataMember]公共字符串文本{get;set;}
[DataMember]公共列表列表1{get;set;}=new List();
[DataMember]公共列表列表2{get;set;}=new List();
[DataMember]公共列表List3{get;set;}=new List();
[DataMember]公共列表列表4{get;set;}=new List();
[DataMember]公共列表列表5{get;set;}=new List();
}
[DataContract(IsReference=true)]
公共B级
{
[DataMember]公共列表列表1{get;set;}=new List();
[DataMember]公共列表列表2{get;set;}=new List();
[DataMember]公共列表List3{get;set;}=new List();
[DataMember]公共列表列表4{get;set;}=new List();
}
[DataContract(IsReference=true)]
公共C类
{
[DataMember]公共字符串Id{get;set;}
[DataMember]公共字符串文本{get;set;}
[DataMember]公共列表列表1{get;set;}=new List();
[DataMember]公共列表列表2{get;set;}=new List();
[DataMember]公共列表List3{get;set;}=new List();
}
私有void序列化()
{            
var ds=新的DataContractSerializer(typeof(ParentClass));
var settings=newxmlwritersettings{Indent=true};
使用(var w=XmlWriter.Create(@“test.xml”,设置))
{
ds.WriteObject(w,ParentClassObject);
}
}
有人有主意吗


致以最良好的祝愿

引用跟踪序列化序列化序列化图中遇到的任何对象的第一次出现,我相信
DataContractSerializer
是深度优先的序列化程序。因此,如果您的对象图非常深(例如,您正在序列化一个链表),则可能会发生这种情况。看看Json.NET有没有类似的问题。也许没有,也许你有一个真正的bug。您能否与重现问题的
ParentClassObject
实例共享一个?