我正在使用C#实现一个基于文件的序列化对象队列.
Push()
将一个对象序列化为二进制,并将其附加到文件的末尾。Pop()
应该从文件的一开始就反序列化一个对象(这部分我已经开始工作了)。然后,反序列化部分应该从文件中删除,使下一个对象成为“第一个”。从文件系统的角度来看,这仅仅意味着在磁盘上复制文件头几个字节,然后移动“文件的开始”指针。问题是如何在C#中实现这一点?有可能吗?
发布于 2013-04-10 16:13:34
我看得最简单
( 1)源源不断地输出(就像日志一样,将其转储到文件中),
(注:您需要一些分隔符和“一致格式”的“文件”-基于您的数据)
)和后面的流(从一开始就读取文件,一次读取,然后处理w/o删除任何内容)。
那会很好,FIFO (先到先出)。
所以,我的建议--不要试图通过删除、跳过等方法来优化这一点(而是重新组合并使用更多的文件。
3)如果您担心事情的规模,那么只需将其划分成足够小的文件,例如每100或1,000 records
(取决于,做一些计算)。
您可能需要在这里创建某种“虚拟器”,它映射文件,跟踪您的“数据库”,如果它是多个文件的话。最简单的方法是只使用文件系统和检查文件时间等,或者添加一些基本代码来改进它。
但是,我认为如果您必须确保'transactions‘,那么您可能会遇到问题--也就是说,如果事情失败了,那么您需要跟踪文件的关闭位置、回溯等。
这可能是个问题,但如果真的有必要(有多重要),你最好知道。您可以始终工作“每个文件”和每个较小的文件。如果失败,回滚并再次执行文件(或日志问题)。如果成功,您可以删除文件(成功后)并继续这样下去。
这是一种非常“手工制作”的方法,但应该让您使用一个简单且不太苛刻的解决方案(如您所描述的)。或者其他类似的东西。
我应该加上..。
您还可以省去一些麻烦,并使用一些可移植的数据库来实现该功能或类似的功能。这完全是基于手工编码的想法--一种最简单的解决方案(我们可能会想出更聪明的方法,但迟到了--这就是我所拥有的)。
发布于 2013-04-10 16:20:06
文件不是那样工作的。你可以剪短结束,但不能从开始。为了在开始时修改一个文件以删除内容,您需要重写整个文件。
我希望你会想办法解决你的问题。但是,线性文件完全不适合表示FIFO队列。
https://stackoverflow.com/questions/15922823
复制