2009-08-14 44 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