2009-08-14 48 views
2

我需要打開一個文件,反序列化對象列表,從列表中刪除其中一個對象,然後重新序列化列表<>返回到文件而不釋放對文件的鎖定。文件流,鎖定和serlial化

從列表中反序列化和刪除對象<>沒有問題,當我嘗試序列化列表<>時,問題出現在我收到以前數據的剩餘部分時......任何人的任何想法如何刪除文件末尾剩餘的舊數據?

謝謝, 保羅。

+0

這聽起來像你應該使用一個數據庫。 SQL Server Express 2008是免費的,並且對XML列有豐富的支持。 – 2009-08-14 16:20:16

+0

嗨,約翰。如果我已經寫了規範然後這就是我會用的,不幸的是我沒有這樣做,所以我不得不與文件做。 – paulio 2009-08-14 16:40:33

回答

0

我得到以前的數據

的我假設你打開文件,讀/寫訪問的遺體,而你把它反序列化和序列化之間的開放?您需要:

  • 打開爲只讀,反序列化數據,並關閉文件
  • 打開該文件作爲唯一的(無追加到它)寫入,序列化數據,並關閉該文件的文件

UPDATE:

如何保持這兩個獨立的操作間上鎖的文件嗎?

好一點......在這種情況下,你可以嘗試截斷流,而它是開放的,使用SetLength:

using(FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) 
{ 
    data = Deserialize(fs); 
    DoSomething(data); 

    // Truncate the file : 
    fs.SetLength(0) 
    fs.Position = 0; 

    Serialize(fs, data); 
} 

(未測試)

+0

如何讓這兩個獨立操作之間的文件鎖定? – paulio 2009-08-14 15:47:21

+0

看到我的更新回答 – 2009-08-14 16:18:31

+0

謝謝托馬斯,你的代碼完全按照你寫的那樣工作。有趣的是,多麼簡單的答案是如此簡單,以至於你錯過了它們(在這種情況下是SetLength()方法)。再次感謝,保羅。 – paulio 2009-08-14 16:38:28

2

將您的序列化數據寫回文件時,將文件打開爲(FileMode.Truncate)。這將確保文件被您的新數據完全覆蓋,並且不會留下現有數據的殘餘。

請參閱 「FileMode.Truncate」:
http://msdn.microsoft.com/en-us/library/system.io.filemode(VS.85).aspx

此外,我會建議使用protobuf-net爲您的序列化引擎使用。這是一個更快和(在某些情況下,如混淆)更可靠的序列化系統。

+0

感謝您的評論,但我如何保持這兩個獨立的操作之間的文件鎖定? – paulio 2009-08-14 15:49:47

+0

你有控制寫入文件的所有進程嗎?如果是這樣,然後使用互斥鎖進行同步:http://www.albahari.com/threading/part2.aspx#_Mutex – 2009-08-14 15:53:35

+0

感謝您的快速響應。不幸的是,我無法控制寫入文件的進程。 – paulio 2009-08-14 16:03:28