我有一个带有ASMX启动项目的c#解决方案,还有一些其他项目。其中一个项目(比如ThirdProject
)有一个类(比如DataReader
)和一个方法(比如ReadData()
),它执行流的反序列化。流本身是正常的,它来自嵌入式资源,并且StreamReader可以无错误地读取它到字符串,它实际上是一个有效的xml字符串。但反序列化会抛出StackOverflowException。
现在来了怪异。出于测试目的,我已经为这个c#解决方案创建了一个额外的项目,这是一个winform项目。如果我将此winform项目设置为解决方案的启动项目,那么它会调用ThirdProject.DataReader. ReadData()
过程而不会出现任何错误!反序列化完成了!
我通过更改位数(x86或x64)以及更改目标.Net Framework(从4.0到4.7.2)重复我的表达,但结果始终相同。
我应该在哪里搜索此错误的原因?任何提示都将不胜感激。
编辑。
有问题的代码部分是这样的:
using (Stream stream = assembly.GetManifestResourceStream(xmlname))
{
var l = stream.Length;
var ret_obj = ktAntragsdatenAbrufenXmlFormat.Deserialize(stream);
...
}
stream.Length是18671.ktAntragsdatenAbrufenXmlFormat
是一个静态的System.Xml.Serialization.XmlSerializer
此代码部分运行时没有错误:
using (Stream stream = assembly.GetManifestResourceStream(xmlname))
{
var l = stream.Length;
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();
}
由于reader.ReadToEnd()
似乎工作正常,请尝试以下方法:
using (Stream stream = assembly.GetManifestResourceStream(xmlname))
{
var l = stream.Length;
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();
using (TextReader reader = new StringReader(text))
{
var ret_obj = ktAntragsdatenAbrufenXmlFormat.Deserialize(stream);
}
}
即使你有一个有效的xml,它也可以有引用循环。如果您的Web服务是json,您可以设置一个引用循环处理策略,如ReferenceLoopHandling.Ignore某处,没有使用它,但必须有一个选项。如果它不是json,它就不会像XML一样通过你的web服务,我不知道在这种情况下是否存在一个选项。你可能要摆脱裁判。在发送之前手动循环,并在它到达另一侧时重建它们。
Nvm,不是你的情况......不管怎么说,不管怎样