У меня есть окно списка, когда элемент выбран или отменен. Я хочу сохранить изменения в 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());
Есть ли способ оптимизировать мои подключения к файлу, чтобы я не спотыкался о себе?
Возможно, вам нужно вызвать 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;
}