gpt4 book ai didi

c# - 序列化期间出现 StackOverFlowException

转载 作者:行者123 更新时间:2023-12-04 03:13:20 25 4
gpt4 key购买 nike

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

字典看起来像

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

如有任何帮助,我们将不胜感激。

最佳答案

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

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());
}
}

抛出错误:

Object graph for type 'Foo' contains cycles and cannot be serialized if reference tracking is disabled.

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

在本地,我在 Bar 结束前接到了 528 次调用。如果您在堆栈中之上已经有了复杂的代码,那肯定会导致堆栈溢出。

关于c# - 序列化期间出现 StackOverFlowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4969545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com