我需要打開一個文件,反序列化對象列表,從列表中刪除其中一個對象,然後重新序列化列表<>返回到文件而不釋放對文件的鎖定。文件流,鎖定和serlial化
從列表中反序列化和刪除對象<>沒有問題,當我嘗試序列化列表<>時,問題出現在我收到以前數據的剩餘部分時......任何人的任何想法如何刪除文件末尾剩餘的舊數據?
謝謝, 保羅。
我需要打開一個文件,反序列化對象列表,從列表中刪除其中一個對象,然後重新序列化列表<>返回到文件而不釋放對文件的鎖定。文件流,鎖定和serlial化
從列表中反序列化和刪除對象<>沒有問題,當我嘗試序列化列表<>時,問題出現在我收到以前數據的剩餘部分時......任何人的任何想法如何刪除文件末尾剩餘的舊數據?
謝謝, 保羅。
我得到以前的數據
的我假設你打開文件,讀/寫訪問的遺體,而你把它反序列化和序列化之間的開放?您需要:
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);
}
(未測試)
將您的序列化數據寫回文件時,將文件打開爲(FileMode.Truncate)。這將確保文件被您的新數據完全覆蓋,並且不會留下現有數據的殘餘。
請參閱 「FileMode.Truncate」:
http://msdn.microsoft.com/en-us/library/system.io.filemode(VS.85).aspx
此外,我會建議使用protobuf-net爲您的序列化引擎使用。這是一個更快和(在某些情況下,如混淆)更可靠的序列化系統。
這聽起來像你應該使用一個數據庫。 SQL Server Express 2008是免費的,並且對XML列有豐富的支持。 – 2009-08-14 16:20:16
嗨,約翰。如果我已經寫了規範然後這就是我會用的,不幸的是我沒有這樣做,所以我不得不與文件做。 – paulio 2009-08-14 16:40:33