【发布时间】:2011-03-16 13:16:46
【问题描述】:
我面临以下问题。我需要将对象流(反)序列化(二进制)到磁盘上的单个文件。序列化部分不是问题,只需以附加模式打开一个流并使用 .Net 的 BinaryFormatter Serialize 方法就可以了。这种方法的问题是我不能只将此流提供给 BinaryFormatter 的反序列化函数,它包含的不是我已序列化的对象的单个实例。
此问题是否存在通用解决方案?序列化到给定流的所有对象都是相同类型的,所以至少我们不需要弄清楚要反序列化什么,这是给定的,但它似乎并没有为我提供解决方法。
基于回复的说明:预计发送的对象数量会很大,因此将它们全部保存在包装器集合中是不可行的(因为刷新到磁盘需要全部加载它们进入内存 -> 添加新的 -> 刷新到磁盘)。
- 通常,当您序列化单个对象时,您会得到一个包含以下内容的文件:
[对象]
- 我创建的是一个文件,其中包含:
[对象][对象][对象][对象]...[对象]
我需要反序列化各个 Object 实例。
提前致谢!
答案:由于在这个帖子中提到了答案(足够清晰),但从未明确说明,我想我会在这里陈述:
while (fileStream.Position < fileStream.Length)
messages.Add((Message)formatter.Deserialize(fileStream));
BinaryFormatter 将根据需要一次反序列化一个对象 :) 您可能希望缓存 fileStream.Length 属性,因为每次调用该属性时都会重新计算长度,从而减慢速度。我不知道为什么我在发布这个问题之前第一次尝试它时不起作用,但现在它确实可以完美地工作。
【问题讨论】:
标签: c# .net file serialization binary