【问题标题】:StackOverFlowException during Serialization序列化期间的 StackOverFlowException
【发布时间】:2011-02-11 13:29:31
【问题描述】:

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

字典看起来像

 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]修饰。

任何帮助将不胜感激。

【问题讨论】:

  • 第一次调用时你会得到这个异常吗?
  • 什么是DataHoldertemplateData 是什么?除了继承之外,其他类型还包括什么?
  • 另外,StackOverflowException 的信息是什么?它是否为您提供了有关问题所在的任何线索?
  • 每次都抛出异常。 TemplateData 是一种自定义类型,其中包含要序列化的数据,它包含一个字典以及其他对象。该消息本身并没有说明任何有用的信息,您甚至无法获得 StackOverflowException 的堆栈跟踪,因为此时系统并不处于稳定状态。

标签: c# datacontractserializer stack-overflow


【解决方案1】:

如果你在图中有一个循环,我可能会期待这样的结果,但不知何故没有检测为对象身份失败。循环,我的意思是:

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 个电话。如果您在堆栈中上面已经有复杂的代码,它肯定会导致堆栈溢出。

【讨论】:

  • (为了比较,在我自己的序列化程序中,我开始检查深度大约为 10?50?类似的循环)
  • Marc - 你命中了目标。类中的一个属性是调用构造函数,这导致了整个递归循环,从而导致异常。非常感谢您的帮助..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多