c# - 频繁序列化时使用Xml序列化的正确方法

标签 c# .net serialization file-io 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;
}

其名称如下:

// 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/

相关文章:

c# - 解释 SSH 输出

c - 使用 C 对 JSON 或任何纯文本进行二进制序列化

ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式?

c# - linq 案例陈述

c# - WinForms 应用程序的最佳数据访问模型

c# - C# 应用程序启动时出现 fatal error

c# - 通过 mvc 转发器发布值

java - 使用 ReferenceTypeDeserializer 与 Jackson & Spring 反序列化通用类型

c# - 存储过程成功执行,但更改未保存到数据库

c# - 安装项目 Visual Studio 和 Nuget