序列化期间的StackOverFlowException

时间:2011-02-11 13:29:31

标签: c# datacontractserializer stack-overflow

我尝试序列化一个自定义类型,其中包含其他成员之间的字典。与字典的键和值相关联的类型是实现的接口。

字典看起来像

 Dictionary<ITypeA, ITypeA> 

TypeA implements ITypeA, 
SubTypeOfA inherits from TypeA
SubTypeOfB inherits from SubTypeOfA

伪代码看起来像这样:

            List<Type> knownTypes = new List<Type>() { 
                typeof(TypeA), 
                typeof(SubTypeOfA),
                typeof(SubTypeOfB)
            };

DataContractSerializer serializer =
                new DataContractSerializer(typeof(DataHolder), knownTypes);

            using (FileStream fs = new FileStream(completeFilePath, FileMode.Create))
            {
                serializer.WriteObject(fs, templateData);
                success = true;
            }

当WriteObject()被调用时,我得到一个StackOverflowException,对导致它发生的原因一无所知。

层次结构中的所有类都使用[DataContract]进行修饰,要序列化的成员将使用[DataMember]进行处理。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

如果您在图表中有一个循环,但是某种方式被检测为对象标识失败,我可能会期待这样的事情。循环,我的意思是:

using System.Runtime.Serialization;
[DataContract] class Foo {
    public Foo() { Bar = this; }
    [DataMember] public Foo Bar { get; set; }
    static void Main() {
        new DataContractSerializer(typeof(Foo)).WriteObject(
            System.IO.Stream.Null, new Foo());
    }
}

抛出错误:

  

“Foo”类型的对象图包含循环,如果禁用参考跟踪,则无法序列化。

这是因为它试图走树(而不是图形),并注意到重复(相同的对象引用),并停止。然而,通过测试上面的内容(并且看到调用get的时候),看起来DCS实际上通过发现疼痛来实现这一点 - 在中止之前的深度非常高。

在本地,我在Bar死前会收到528个电话。如果你已经在堆栈中有上面的上面的复杂代码,那么肯定可以解决堆栈溢出问题。