DataContractSerializer 抛出堆栈溢出

问题描述

我想将一个类序列化为一个 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);          
    }
}

有人有想法吗?

最好的问候!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)