XmlSerializer会在反序列化时引发StackOverflowException,但前提是必须从ASMX Web服务调用它

时间:2019-03-08 15:58:35

标签: c# asmx xmlserializer

我有一个带有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();
}

2 个答案:

答案 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,这不是您的情况……还是请把它留在这里