我正在使用C#实现基于文件的序列化对象队列。
Push()
会将对象序列化为二进制文件并将其附加到文件的末尾。Pop()
应该从文件的开头反序列化一个对象(这部分我开始工作)。然后,应该从文件中删除反序列化的部分,使下一个对象成为“第一个”。从文件系统的角度来看,这只意味着在磁盘上进一步复制文件头几个字节,然后移动“文件的开头”指针。问题是如何在C#中实现这一点?它有可能吗?
答案 0 :(得分:1)
我最容易看到
1)流出(如日志,将其转储到文件中),
(注意:根据您的数据,您需要一些分隔符和“文件”的“一致格式”)
2)后来流入(只需从头开始读取文件,一次性处理,无需删除任何内容)
并且它工作正常,FIFO(先进先出)。
所以,我的建议 - 不要试图通过删除,跳过来优化它 等(而是重新组合并使用更多文件。
3)如果您担心事物的规模 - 那么只需将其“分割”成足够小的文件,例如每100或1,000 records
(取决于,做一些计算)。
你可能需要在这里制作某种“虚拟器”,它可以映射文件,跟踪你的“数据库”,如果是在多个文件上。最简单的方法是只使用文件系统并检查文件时间等。或者添加一些基本代码来改进它。
但是,如果你必须确保,我认为你可能会遇到问题 '交易' - 即如果事情失败,您需要跟踪 文件中断,回溯等。
这可能是一个问题,但如果真的有必要(你有多么重要),你最了解。您可以始终按“每个文件”和较小的文件工作。如果失败,则回滚并再次执行该文件(或记录问题)。如果成功,你可以删除文件(成功后)并继续这样做。
这是一种非常“手工制作”的方法,但是应该让你选择一个简单且不太苛刻的解决方案(就像你所描述的那样)。或类似的规定。
我应该添加 ...
你也可以省去一些麻烦,并使用一些便携式数据库来做类似的事情。这纯粹是基于手工编码最简单的解决方案的想法(我们可能会想出更聪明的东西,但是我迟到了这就是:)。
答案 1 :(得分:1)
文件无法正常工作。你可以削减结束,但不是开头。为了改变文件以在开头删除内容,您需要重新编写整个文件。
我希望您能找到其他方法来解决您的问题。但是线性文件完全不适合表示FIFO队列。