我有一个列表框,当选择或取消选择某个项目时,我想将更改保存到 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());
有没有办法优化我与文件的连接,这样我就不会被自己绊倒?
最佳答案
也许您需要在序列化和反序列化方法中的 TextWriter
对象上调用 Close
?或者使用 using
结构强制在 block 末尾进行处理。
示例:
// 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;
}
关于c# - 频繁序列化时使用Xml序列化的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2032607/