Правильный способ использования XmlSerialization с частыми сериализациями

2

У меня есть окно списка, когда элемент выбран или отменен. Я хочу сохранить изменения в XML файле (поэтому он всегда обновляется в файле, и пользователю не нужна кнопка "сохранить" ).

Во время тестирования я иногда нажимаю на это исключение IOException:

Процесс не может получить доступ к файлу "C:\MyPath\MyFile.xml", потому что он используется другим процессом.

Вот мой код сериализации XML:

// Save an object out to the disk
public static void SerializeObject<T>(this T toSerialize, String filename)
{
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
    TextWriter textWriter = new StreamWriter(filename);

    xmlSerializer.Serialize(textWriter, toSerialize);
}

// Load an object from the disk
private static T DeserialzeObject<T>(String filename) where T : class
{
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

    try
    {
        TextReader textReader = new StreamReader(filename);
        return (T)xmlSerializer.Deserialize(textReader);
    }
    catch (FileNotFoundException)
    { }

    return null;
}

И вот как он называется:

// Save off the list because the visibility has changed
public void WorkItemColumnTypeOnVisibleChanged(int fieldID, Visibility visibility)
{
    ColumnFields.SerializeObject(ColumnFields.GetSerializeFilename());
}

десериализацией является тот, который дает ошибку:

WorkItemColumnTypes savedVersion = DeserialzeObject<WorkItemColumnTypes>(result.GetSerializeFilename());

Есть ли способ оптимизировать мои подключения к файлу, чтобы я не спотыкался о себе?

Теги:
file-io
serialization
xml-serialization

1 ответ

5
Лучший ответ

Возможно, вам нужно вызвать Close в объектах TextWriter в ваших методах сериализации и десериализации? Или, альтернативно, используйте конструкцию using для принудительной утилизации в конце блока.

Пример:

// Save an object out to the disk
public static void SerializeObject<T>(this T toSerialize, String filename)
{
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
    using(TextWriter textWriter = new StreamWriter(filename))
    {

        xmlSerializer.Serialize(textWriter, toSerialize);
    }
}

// Load an object from the disk
private static T DeserialzeObject<T>(String filename) where T : class
{
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

    try
    {
        using(TextReader textReader = new StreamReader(filename))
        {
            return (T)xmlSerializer.Deserialize(textReader);
        }
    }
    catch (FileNotFoundException)
    { }

    return null;
}
  • 0
    Звонок, чтобы закрыть исправил это. Спасибо!
  • 2
    Способ использования более безопасен в случае, если сама сериализация или десериализация вызывает исключение. Вы можете справиться с этим, поместив close в предложение finally, но это именно то, что делает использование для вас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню