c# - 将对象流二进制(反)序列化为 1 个文件

标签 c# .net file serialization binary

我面临着以下问题。我需要将对象流(反)序列化(二进制)到磁盘上的单个文件。序列化部分不是问题,只需在追加模式下打开流并使用 .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/

相关文章:

c# - 当未进行 4 字节对齐时,Monotouch 浮点指针会抛出 NullReferenceException

c# - 获取线程 ID

.net - 绘图.图形,性能不佳

c - FILE* 返回初始化变量并插入 FILE* 读取的输出

Java 文件分割

c# - TableLayoutPanel 中的垂直滚动条

c# - WCF - 尝试接收大型数据列表时出错(~5000 个对象)

c# - 从工作线程更新表单控件的最佳方法是什么?

c# - 如何在 .NET SoapFormatter 中控制命名空间?

file - 如何使用批处理文件随机重新排列文本文件中的行