У меня была точно такая же проблема раньше. Мое лучшее предположение состоит в том, что «корневой элемент», который ищет XmlSerializer, является элементом с тем же именем, что и тип, который он пытается десериализовать. Таким образом, изменение вашего XML на следующее должно работать: (изменения выделены жирным шрифтом)
<?xml version="1.0" encoding="utf-8" ?>
<SGlobalSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<key>KEY</key>
<last>LAST</last>
</SGlobalSettings>
Я не знаю, почему TextReader будет неправильно читать файл при автоматической утилизации, но знаете ли вы, что существует перегрузка XmlSerializer.Deserialize
, которая принимает экземпляр Stream
в качестве аргумента? Использование этой перегрузки может решить вашу проблему; может существовать несколько перегрузок, потому что каждый из них использует базовый поток по-своему. Похоже, это совпадает с типичными скрытыми хуками Microsoft.
Я бы попытался вообще обойти TextReader и использовать вместо этого следующий код:
XmlSerializer gXmls = new XmlSerializer(typeof (SGlobalSettings));
using (Stream gStream = File.OpenRead("global.xml"))
{
global = (SGlobalSettings)gXmls.Deserialize(gStream);
}