XmlSerializer создает дескриптор StackOverflowException при десериализации, но только если он вызывается из веб-службы ASMX - PullRequest
1 голос
/ 08 марта 2019

У меня есть решение ac # с проектом запуска ASMX, а также с некоторыми другими проектами.Один из этих проектов (скажем, 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);
    ...
}

Поток. Длина 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 голосов
/ 08 марта 2019

Поскольку 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);
    }
}
0 голосов
/ 08 марта 2019

Даже если у вас есть действительный xml, у него могут быть циклы ссылок. Если вашим веб-сервисом является json, вы можете установить стратегию обработки ссылочных циклов, например ReferenceLoopHandling. Где-то игнорировать, не использовал ее, но для этого должна быть опция. Если это не JSON, он просто не будет проходить через ваш веб-сервис как XML, я понятия не имею, существует ли опция в этом случае. Возможно, вам придется избавиться от реф. зацикливается вручную перед отправкой и восстанавливает их, как только они поступят на другую сторону.

nvm, это не ваш случай ... я все равно оставлю это здесь

...