如何在不锁定文件的情况下将xml反序列化为对象?

时间:2012-02-19 19:13:47

标签: c# xml deserialization

我有一个用于数据库的xml文件,这意味着xml经常更新。 对于xml数据库有一个FileWatcher,一旦xml​​被更新,我得到一个事件然后我将xml反序列化为对象并检查是否确实有变化。

我遇到的问题是,一旦我反序列化xml,Stream Reader就会锁定文件,这样我在尝试更新它时可能会遇到异常。

是否有可能在不锁定文件的情况下反序列化xml?

        XmlSerializer serializer = new XmlSerializer(typeof (MyType));
        Stream reader = new FileStream(File, FileMode.Open);
        var myType = (MyType) serializer.Deserialize(reader);

2 个答案:

答案 0 :(得分:6)

new FileStream(File, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

FileShare.ReadWrite 是关键。请记住将文件流放入using语句中!

编辑:根据评论(谢谢!)如果写入文件的其他进程需要FileShare.None,则仍然存在问题。在作家的情况下可能就是这种情况。如果是这种情况,唯一的解决方案是对不同的文件进行操作。我建议您在写入后的第一次访问时将文件从“file.dat”重命名为“file_readonly1.dat”。然后,您的阅读过程可以根据需要多次读取文件,而不会阻止编写器。编写器将在下次运行时创建一个新文件。一旦某个读者看到新的“file.dat”,它会将其重命名为“file_readonly2.dat”。从那时起,读者应该使用较新版本的文件。等等。我认为这个方案是100%安全的。

答案 1 :(得分:1)

string xmlString = string.Empty
using (StreamReader reader = new StreamReader("xmlfile.xml"))
{
    xmlString = reader.ReadToEnd();
    // after leaving the using scope the streamreader is disposed freeing the file
}

// if the serializer needs a TextReader then you can wrap it here
StringReader strReader = new strReader(xmlString);

var xmlObject = (MyType) serializer.Deserialize(strReader)