XmlSerializer.Serialize не сохраняет файл и не выдает исключение - PullRequest
1 голос
/ 10 апреля 2010

У меня проблема с сохранением моего объекта. Посмотрите на этот код:

public void SerializeToXML(String FileName)
{
    XmlSerializer fSerializer = new XmlSerializer(typeof(Configuration));
    using (Stream fStream = new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        fSerializer.Serialize(fStream, this);
    }
}

Проблема в том, что когда пользователь не имеет прав на местоположение на жестком диске, эта функция не выдает мне никаких исключений и не сохраняет мой файл. Например, сохранение в «C: \ test.xml» ведет себя так, как будто ничего не произошло. И я хотел бы знать, если файл не был сохранен, и было бы хорошо узнать причину.

Я знаю, что могу проверить, существует ли файл в указанном месте, и создать исключение вручную, но разве это не должно быть сделано самим XmlSerializer или FileStream?

Спасибо за ваше время

Edit:

Поскольку я подозревал, что мне пришлось включить дополнительную отладку. Поскольку я использую предложение using, необходимо включить «Включить параметр отладки неуправляемого кода» в свойствах проекта в разделе «Отладка». После этого исключение показывается в процессе отладки.

Edit2

Замена приведенного выше предложения using на этот код вызывает исключение:

public void SerializeToXML(String FileName)
{
    XmlSerializer fSerializer = new XmlSerializer(typeof(Configuration));
    Stream fStream = new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.None);
    try
    {
        fSerializer.Serialize(fStream, this);
    }
    finally
    {
        fStream.Close();
    }
}

Ответы [ 3 ]

1 голос
/ 10 апреля 2010

Я подозреваю, что это связано с вашим оператором using, поскольку он использует скрытую конструкцию try-finally (где метод Dispose() вызывается в предложении finally). Информацию об исключениях, которые не видны за пределами блока using, можно найти здесь .

Попробуйте заменить оператор using на создание экземпляра и вызов его метода Dispose(), и я думаю, что ваша проблема решена. Конечно, впоследствии вы должны заключить свой код в явную структуру try-finally как часть хорошей практики программирования.

1 голос
/ 10 апреля 2010

Перенаправление файлов Vista может объяснить это. Это функция, позволяющая старым программам, которые не обрабатывают UAC, по-прежнему работать. Файл перенаправляется в виртуальное хранилище.

Это произойдет, когда вы используете Visual Studio 2005 или более раннюю версию или сделали что-то, чтобы предотвратить встраивание манифеста в исполняемый файл. Исправьте это , включая манифест .

1 голос
/ 10 апреля 2010

Это звучит очень странно для меня - и не похоже, что это имеет какое-либо отношение к сериализатору. Если у вас нет прав доступа к определенному местоположению, создание FileStream должно вызвать исключение; он не должен ждать до строки Serialize.

Вы абсолютно уверены, что у вас нет какого-то улова выше, который скрывает проблему от вас?

...