我面临以下问题。我需要(de)序列化(二进制)一个对象流到磁盘上的单个文件。序列化部分不是问题,只需在追加模式下打开流并使用.Net的BinaryFormatter序列化方法即可完成。这种方法的问题在于,我不能仅仅将此流传递给BinaryFormatter的反序列化函数,它所包含的不是我已序列化的对象的单个实例。二进制(De)序列化一个对象流到一个文件
是否存在此问题的常见解决方案?序列化到给定流的所有对象都是相同类型的,所以至少我们不需要弄清楚什么是反序列化,这是给定的,但似乎并没有为我提供一条出路。
澄清基于答复:在预期要大发对象的数量,并因此不可能保持他们都在一个包装集合(如刷新到磁盘需要将它们全部加载到内存中 - >添加新的 - >刷新到磁盘)。
- 通常,当你序列化一个对象,你得到一个包含文件:
[对象]
- 我所创造的是包含一个文件:
[对象] [对象] [对象] [对象] ... [对象]
而且我需要反序列化各个对象实例。
在此先感谢!
答:因为答案在这个线程(有足够的清晰度)提到,但从来没有明确说明,我以为我会在这里声明它:
while (fileStream.Position < fileStream.Length)
messages.Add((Message)formatter.Deserialize(fileStream));
的BinaryFormatter的反序列化将一个对象根据需要:)您可能需要缓存fileStream.Length属性,因为每次调用属性时都会重新计算长度,从而减慢速度。我不知道为什么在发布这个问题之前我第一次尝试它时没有工作,但它现在确实无误地工作。
对象在系统的生命周期中流入,并且存在其中的很大数量,我需要冲洗。将它们保存在包装器集合中时,我将不得不将它们全部保存在内存中,并且每次我要刷新到磁盘时都要重新写入整个文件。 – United 2010-07-15 17:50:28
第一个建议不起作用,因为需要另一个库(如果我运气好的话,通过合法的6个月+审批流程)。第二个是有趣的。对于第二个答案,看起来他们已经有了正常的序列化来从一个文件反序列化一系列对象,而这些对象不在集合中。在我的测试中不起作用,所以我想我会试着进一步研究它,或者在那个问题中跟进。 – United 2010-07-15 20:29:45