我尝试序列化一个自定义类型,其中包含其他成员之间的字典。与字典的键和值相关联的类型是实现的接口。
字典看起来像
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]进行处理。
任何帮助都将不胜感激。
答案 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个电话。如果你已经在堆栈中有上面的上面的复杂代码,那么肯定可以解决堆栈溢出问题。