使用XmlSerialization和频繁序列化的正确方法

Vac*_*ano 2 .net c# file-io serialization xml-serialization

我有一个列表框,当选择或取消选择项目时,我想将更改保存到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;
}
Run Code Online (Sandbox Code Playgroud)

以下是它的调用方式:

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

反序列化是给出错误的那个:

WorkItemColumnTypes savedVersion = DeserialzeObject<WorkItemColumnTypes>(result.GetSerializeFilename());
Run Code Online (Sandbox Code Playgroud)

有没有办法优化我与文件的连接,这样我就不会绊倒自己?

Avi*_* P. 5

也许您需要调用序列化和反序列化方法中CloseTextWriter对象?或者,也可以使用该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;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果序列化或反序列化本身引发异常,则使用方式更安全.你可以通过将close放在finally子句中来处理它,但这正是使用对你做的. (2认同)