我需要打开一个文件,反序列化对象列表,从列表中删除其中一个对象,然后重新序列化列表<>返回到文件而不释放对文件的锁定。文件流,锁定和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