2010-07-15 62 views
5

我面临以下问题。我需要(de)序列化(二进制)一个对象流到磁盘上的单个文件。序列化部分不是问题,只需在追加模式下打开流并使用.Net的BinaryFormatter序列化方法即可完成。这种方法的问题在于,我不能仅仅将此流传递给BinaryFormatter的反序列化函数,它所包含的不是我已序列化的对象的单个实例。二进制(De)序列化一个对象流到一个文件

是否存在此问题的常见解决方案?序列化到给定流的所有对象都是相同类型的,所以至少我们不需要弄清楚什么是反序列化,这是给定的,但似乎并没有为我提供一条出路。

澄清基于答复:在预期要大发对象的数量,并因此不可能保持他们都在一个包装集合(如刷新到磁盘需要将它们全部加载到内存中 - >添加新的 - >刷新到磁盘)。

  • 通常,当你序列化一个对象,你得到一个包含文件:

[对象]

  • 我所创造的是包含一个文件:

[对象] [对象] [对象] [对象] ... [对象]

而且我需要反序列化各个对象实例。

在此先感谢!

答:因为答案在这个线程(有足够的清晰度)提到,但从来没有明确说明,我以为我会在这里声明它:

while (fileStream.Position < fileStream.Length) 
    messages.Add((Message)formatter.Deserialize(fileStream)); 

的BinaryFormatter的反序列化将一个对象根据需要:)您可能需要缓存fileStream.Length属性,因为每次调用属性时都会重新计算长度,从而减慢速度。我不知道为什么在发布这个问题之前我第一次尝试它时没有工作,但它现在确实无误地工作。

回答

1

尝试把你的对象变成一个序列化的集合(我相信列表是可序列化),然后响应澄清(反)序列对象

编辑: 我刚刚意识到这个问题有相同的答案作为question。而不是试图重新创造一个答案,我只是看看马克Gravell的答案,或者this one

+0

对象在系统的生命周期中流入,并且存在其中的很大数量,我需要冲洗。将它们保存在包装器集合中时,我将不得不将它们全部保存在内存中,并且每次我要刷新到磁盘时都要重新写入整个文件。 – United 2010-07-15 17:50:28

+0

第一个建议不起作用,因为需要另一个库(如果我运气好的话,通过合法的6个月+审批流程)。第二个是有趣的。对于第二个答案,看起来他们已经有了正常的序列化来从一个文件反序列化一系列对象,而这些对象不在集合中。在我的测试中不起作用,所以我想我会试着进一步研究它,或者在那个问题中跟进。 – United 2010-07-15 20:29:45

0

的文件序列化,所以我想直接将您的流文件会做什么,你似乎想要。更具体的解释你的情况将有助于提供更有用的答案。 (我希望我可以将它作为'评论'输入,但不知何故评论按钮不适用于我。)

+0

序列化不是问题。问题是,如果我一次序列化一个对象(我必须)并将它们追加到一个流中,我无法反序列化结果流,因为整个流不代表单个对象。 – United 2010-07-15 18:07:56

+0

基本上,通常当你序列化一个对象到一个文件时,该文件将包含这个对象(即[Object]),所以要反序列化你做的事Object obj = binaryFormatter.Deserialize(fs,MyObjType);我所拥有的是[Object] [Object] ... [Object]形式的文件,所以我不能仅仅在这个文件上调用反序列化函数,因为我提供的反序列化器不是单个对象的序列化。 – United 2010-07-15 19:13:11

+0

我在想什么是把一些分隔符(它提供了一个串行器永远不会产生的符号组合)。这样我就可以在一个流中手动将文件解析为块(表示单个序列化对象),并将块分配给另一个流,然后反馈给解串器。 – United 2010-07-15 19:16:48

相关问题