XmlSerializer在反序列化时抛出StackOverflowException,但前提是从ASMX Web服务调用它

问题描述 投票:1回答:2

我有一个带有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();
}
c# asmx xmlserializer
2个回答
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
投票

即使你有一个有效的xml,它也可以有引用循环。如果您的Web服务是json,您可以设置一个引用循环处理策略,如ReferenceLoopHandling.Ignore某处,没有使用它,但必须有一个选项。如果它不是json,它就不会像XML一样通过你的web服务,我不知道在这种情况下是否存在一个选项。你可能要摆脱裁判。在发送之前手动循环,并在它到达另一侧时重建它们。

Nvm,不是你的情况......不管怎么说,不管怎样

© www.soinside.com 2019 - 2024. All rights reserved.