我面临着以下问题。我需要将对象流(反)序列化(二进制)到磁盘上的单个文件。序列化部分不是问题,只需在追加模式下打开流并使用 .Net 的 BinaryFormatter Serialize 方法即可。这种方法的问题是我不能只将此流提供给 BinaryFormatter 的反序列化函数,它包含的不是我序列化的对象的单个实例。
是否存在针对此问题的通用解决方案?序列化到给定流的所有对象都属于同一类型,因此至少我们不需要弄清楚要反序列化的内容,这是给定的,但它似乎并没有向我建议解决此问题的方法。
基于回复的澄清:发送的对象数量预计会很大,因此将它们全部保存在包装器集合中是不可行的(因为刷新到磁盘需要将它们全部加载入内存 -> 添加新的 -> 刷新到磁盘)。
- 通常,当您序列化单个对象时,您会得到一个包含以下内容的文件:
[对象]
- 我正在创建的文件包含:
[对象][对象][对象][对象]...[对象]
我需要反序列化各个对象实例。
提前致谢!
答案:由于这个线程中提到了答案(足够清晰),但从未明确说明,我想我会在这里说明:
while (fileStream.Position < fileStream.Length)
messages.Add((Message)formatter.Deserialize(fileStream));
BinaryFormatter 将根据需要一次反序列化一个对象 :) 您可能希望缓存 fileStream.Length 属性,因为每次调用该属性时似乎都会重新计算长度,从而减慢速度。我不知道为什么在发布这个问题之前我第一次尝试它时它不起作用,但它现在确实可以完美地工作。
最佳答案
尝试将您的对象放入一个可序列化的集合中(我相信 List 是可序列化的),然后(反)序列化那个对象
编辑以回应澄清: 我刚刚意识到这个问题的答案与 question 相同.与其尝试重新发明一个答案,不如看看 Mark Gravell 的答案,或者到 this one。
关于c# - 将对象流二进制(反)序列化为 1 个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3258235/