我有一个带有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();
}
答案 0 :(得分:0)
由于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);
}
}
答案 1 :(得分:-1)
即使您具有有效的xml,它也可能具有引用循环。 如果您的Web服务是json,则可以设置诸如ReferenceLoopHandling之类的引用循环处理策略。忽略某个地方,没有使用过,但是必须有一个选项。 如果它不是json,它将不会以XML格式通过您的Web服务,我不知道在这种情况下是否存在选项。您可能必须摆脱参考。在发送之前先手动循环并重建它们,一旦到达另一端。
Nvm,这不是您的情况……还是请把它留在这里