C# 序列化期间的StackOverFlowException
我正在尝试序列化一个在其他成员中包含字典的自定义类型。与字典的键和值关联的类型是实现的接口 这本字典看起来像C# 序列化期间的StackOverFlowException,c#,datacontractserializer,stack-overflow,C#,Datacontractserializer,Stack Overflow,我正在尝试序列化一个在其他成员中包含字典的自定义类型。与字典的键和值关联的类型是实现的接口 这本字典看起来像 Dictionary<ITypeA, ITypeA> TypeA implements ITypeA, SubTypeOfA inherits from TypeA SubTypeOfB inherits from SubTypeOfA 字典 TypeA实现了ittypea, 子类型A继承自类型A 子类型B继承自子类型A 伪代码如下所示:
Dictionary<ITypeA, ITypeA>
TypeA implements ITypeA,
SubTypeOfA inherits from TypeA
SubTypeOfB inherits from SubTypeOfA
字典
TypeA实现了ittypea,
子类型A继承自类型A
子类型B继承自子类型A
伪代码如下所示:
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;
}
List knownTypes=new List(){
typeof(TypeA),
类型(亚型),
类型(子类型B)
};
DataContractSerializer序列化程序=
新的DataContractSerializer(typeof(DataHolder),knownTypes);
使用(FileStream fs=newfilestream(completeFilePath,FileMode.Create))
{
serializer.WriteObject(fs,templateData);
成功=真实;
}
当调用WriteObject()时,我得到一个StackOverflowException,我不知道是什么导致了这种情况
层次结构中的所有类都用[DataContract]修饰,要序列化的成员用[DataMember]取消创建
任何帮助都将不胜感激。如果您在图表中有一个循环,我可能会期望出现类似的情况,但不知何故,没有检测到对象标识失败。所谓循环,我的意思是:
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实际上是通过发现疼痛来做到这一点的——中止前的深度非常高
在本地,我收到了528个调用
Bar
,然后它就死了。如果堆栈中已经有复杂的代码位于此之上,那么肯定会导致堆栈溢出。第一次调用此异常时是否会出现此异常?什么是DataHolder
?什么是模板数据
?除了继承之外,其他类型由什么组成?还有,StackOverflowException
的消息是什么?它是否为您提供了错误的线索?每次都会抛出异常。TemplateData是一种自定义类型,它具有要序列化的数据,它包含一个字典和其他对象。消息本身没有说任何有用的东西,你甚至无法得到StackOverflowException的堆栈跟踪,因为此时系统还没有处于稳定状态。(相比之下,在我自己的序列化程序中,我开始检查深度大约为10?50?之类的)Marc-你达到了目标。类中的一个属性调用了构造函数,这导致了整个递归循环,导致了异常。非常感谢你的帮助。。