C #, Почему с помощью TextReader выдает исключение после обновления Visual Studio? - PullRequest
1 голос
/ 25 апреля 2011

Почему Deserialize выдает исключение после обновления Visual Studio 2010?

РЕДАКТИРОВАТЬ (изменение вопроса):
Я получил его на работу, удалив оператор using и вызвав Dispose вручную для TextReader gTr.

Новый вопрос:
Почему оператор using вызывает ошибки при чтении с TextReader (после обновления)?

Я сбит с толкуэтот.Я только обновил Visual Studio, и он больше не работает.Раньше он работал прекрасно (в течение нескольких недель).Это также соответствует множеству примеров, которые я читал.Я не вижу, как что-то не так, или как отсутствует Root, или как существует error in XML document (0, 0).

//EXCEPTION
System.InvalidOperationException was caught
Message=There is an error in XML document (0, 0).
Source=System.Xml  
InnerException: System.Xml.XmlException
Message=Root element is missing.
LineNumber=0
LinePosition=0

//SERIALIZE
SGlobalSettings gSettings = new SGlobalSettings();
XmlSerializer gXmls = new XmlSerializer(typeof(SGlobalSettings));
using (TextWriter gTw = new StreamWriter("global.xml"))
{
    gXmls.Serialize(gTw, gSettings);
}

//DESERIALIZE
if (File.Exists("global.xml"))
{
    SGlobalSettings global;
    XmlSerializer gXmls = new XmlSerializer(typeof (SGlobalSettings));
    using (TextReader gTr = new StreamReader("global.xml"))
    {
        global = (SGlobalSettings)gXmls.Deserialize(gTr);
    }
}

//OBJECT
[XmlRootAttribute("Global")]
public class SGlobalSettings
{
    public string key { get; set; }
    public string last { get; set; }

    public SGlobalSettings() { }
}

//XML
<?xml version="1.0" encoding="utf-8" ?> 
<Global xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <key>KEY</key> 
    <last>LAST</last> 
</Global>

Спасибо за любую помощь !!!

Ответы [ 2 ]

1 голос
/ 25 апреля 2011

У меня была точно такая же проблема раньше. Мое лучшее предположение состоит в том, что «корневой элемент», который ищет 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);
}
1 голос
/ 25 апреля 2011

Ошибка в (0, 0) обычно означает, что ваш код может открыть файл, но файл пуст.Попробуйте использовать метод Flush () в разделе сериализации.

Кроме того, ваш код отлично работает на моей Visual Studio 2010 SP1;

...