2

我正在使用 C# 实现基于文件的序列化对象队列。

  • Push()将对象序列化为二进制并将其附加到文件的末尾。
  • Pop()应该从文件的开头反序列化一个对象(这部分我开始工作)。然后,应该从文件中删除反序列化的部分,使下一个对象成为“第一个”。

从文件系统的角度来看,这只是意味着将文件头复制到磁盘上几个字节,然后移动“文件开头”指针。问题是如何在 C# 中实现这一点?有可能吗?

4

2 回答 2

1

最容易看到的

1)流出(如日志,将其转储到文件中),
(注意:您需要一些分隔符和“文件”的“一致格式” - 根据您的数据是什么)

2)和稍后流入(只需从头开始读取文件,一口气,并处理不删除任何内容)

这很好用,FIFO(先进先出)。

所以,我的建议 - 不要试图通过删除、跳过等来优化它(而是重新组合并使用更多文件。

3)如果您担心事情的规模 - 那么只需将其“分区”为足够小的文件,例如每个 100 或 1,000 个records(取决于,做一些计算)。

您可能需要在这里制作某种“虚拟器”,它映射文件,跟踪您的“数据库”,如果它位于多个文件上。最简单的是只使用文件系统并检查文件时间等。或者添加一些基本代码来改进它。

但是,我认为如果您必须确保“事务”,您可能会遇到问题 - 即如果事情失败了怎么办,所以您需要跟踪文件停止的位置,回溯等。

这可能是一个问题,但你最清楚是否真的有必要拥有它(多么重要)。您始终可以“按文件”和按较小的文件工作。如果失败,回滚并再次执行该文件(或记录问题)。如果成功,您可以删除文件(成功后)并继续这样做。

这是非常“手工制作”的方法,但应该让您采用简单且不太苛刻的解决方案(就像您所描述的那样)。或类似的规定。

我可能应该补充...

您还可以为您节省一些麻烦,并为此使用一些便携式数据库或类似的东西。这纯粹是基于手动编码一个最简单的解决方案的想法(我们可能会想出更聪明的东西,但迟到这就是我所拥有的:)。

于 2013-04-11T00:13:34.477 回答
1

Files don't work that way. You can trim off the end, but not the beginning. In order to mutate a file to remove content at the beginning you need to re-write the entire file.

I expect you'll want to find some other way to solve your problem. But a linear file is totally inappropriate for representing a FIFO queue.

于 2013-04-11T00:20:06.413 回答