【问题标题】:Correct way to use XmlSerialization with frequent serializations频繁序列化使用 Xml 序列化的正确方法
【发布时间】:2010-01-09 06:45:42
【问题描述】:

I have a list box that when an item is selected or deselected I want to save the changes to an x​​ml file (so it is always up-to-date on the file and the user does not need a "save" button )。

在测试时我偶尔会遇到这个 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());

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

【问题讨论】:

    标签: c# .net serialization file-io xml-serialization


    【解决方案1】:

    也许您需要在序列化和反序列化方法中对TextWriter 对象调用Close?或者,也可以使用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;
    }
    

    【讨论】:

    • 关闭调用修复了它。谢谢!
    • 如果序列化或反序列化本身引发异常,使用方式更安全。您可以通过将 close 放在 finally 子句中来处理这个问题,但这正是 using 为您所做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多