XMLSerialization не устанавливает свойства при десериализации

У меня странное поведение, которое я даже не знаю, как диагностировать.

Некоторые свойства во время десериализации не устанавливаются (нулевые), хотя я ясно вижу их в (только что созданном) XML-документе. XML-документ выглядит хорошо структурированным и симметричным по отношению к аналогичным типам объектов.

Похоже, что он устанавливает значения до определенного момента, затем прекращает устанавливать значения и игнорирует все остальные данные.

Просто хочу отметить, что последнее значение, которое он устанавливает правильно, — это объект типа, который содержит другой объект, для которого из-за проблем десериализации, подобной синглтону, мне пришлось реализовать IXmlSerializable. Я указываю на это, так как это может указывать на какую-то ошибку, хотя я не могу понять, что это может быть.

EDIT: я прочитал некоторые статьи о получении сборка и код сериализации. По какой-то причине он выводит только файлы .dll и .pdb, но не .cs, как упоминается в статьях.

Спасибо


person New Dev    schedule 17.07.2013    source источник
comment
Пример кода стоит тысячи слов   -  person Lochemage    schedule 18.07.2013
comment
@Lochemage, я бы с удовольствием, но это будет весь проект. Я понятия не имею, как уменьшить проблему   -  person New Dev    schedule 18.07.2013


Ответы (1)


Хорошо, решено! Это двухкомпонентное решение:

1) Включение диагностики

Во-первых, в Visual Studio 2012 (или, возможно, более правильно в .NET 4.5) недостаточно установить следующее в app.config для диагностики XmlSerialization:

<system.diagnostics>
    <switches>
      <add name="XmlSerialization.Compilation" value="1" />
    </switches>
</system.diagnostics>
<system.xml.serialization>
    <xmlSerializer tempFilesLocation="c:\foo"/>
</system.xml.serialization>

Вам также необходимо добавить атрибут useLegacySerializerGeneration="true" для создания автоматически сгенерированного файла .cs сериализатора.

<system.diagnostics>
    <switches>
      <add name="XmlSerialization.Compilation" value="1" />
    </switches>
</system.diagnostics>
<system.xml.serialization>
    <xmlSerializer tempFilesLocation="c:\foo" useLegacySerializerGeneration="true"/>
</system.xml.serialization>

2) Подводный камень в реализации IXmlSerializable

Убедитесь, что XmlReader (когда он находится в методе ReadXml(XmlReader reader) метода IXmlSerializable) находится в StartElement следующего элемента, когда вы закончите с ним, а не в EndElement. Другими словами, обязательно позвоните:

reader.ReadEndElement();

Из-за этого читатель десерализации xml получил искаженные данные и прочитал все элементы в неправильных местах, выдавая нули.

person New Dev    schedule 18.07.2013
comment
Это по-прежнему работает с Visual Studio 2017. Обратите внимание, что при добавлении tempFilesLocation intellisense добавит волнистую форму и скажет, что атрибут tempFilesLocation не разрешен. Игнорирование этого и перестроение позволило мне отлаживать файлы *.cs. Кроме того, файлы randomname.cs, которые мне были нужны, не отображались во временном каталоге, пока я не наткнулся на точку останова, где происходила десериализация. После этого я смог выполнить отладку кода, сгенерированного с помощью wsdl, и определить источник проблемы. - person dunc; 21.05.2018