2012-02-19 52 views
4

我有一個xml文件,我使用數據庫,這意味着xml經常更新。 對於XML數據庫有一個FileWatcher,並且一旦xml​​更新,我得到一個事件,然後我反序列化xml到對象,並檢查是否確實有變化。如何在不鎖定文件的情況下將xml反序列化爲對象?

我的問題是,一旦我反序列化的XML,流讀取器鎖定文件,所以我可能會在嘗試更新它時得到異常。

是否有可能反序列化xml而不鎖定文件?

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

用文件共享權限打開文件? – 2012-02-19 19:17:04

+0

這聽起來相當低效。你有沒有考慮使用數據庫? – 2012-02-19 21:02:15

回答

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%安全的。

+0

如果寫入文件的其他進程需要FileShare.None,這仍然可能無法正常工作。 – 2012-02-19 20:52:12

+1

謝謝!我添加了一個新的方案來避免這個問題。 – usr 2012-02-19 20:57:28

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) 
相關問題