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

use*_*174 4 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);
Run Code Online (Sandbox Code Playgroud)

usr*_*usr 6

new FileStream(File, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
Run Code Online (Sandbox Code Playgroud)

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

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