使用BinaryFormatter反序列化.dat文件列表至文本框遇循环终止问题求助
解决BinaryFormatter反序列化多个列表仅读取第一个的问题
问题核心是:你用BinaryFormatter多次序列化列表对象到同一个文件,但反序列化时只调用了一次反序列化方法,所以只能拿到第一个列表。要读取所有列表,需要循环读取直到文件流到达末尾。
正确的反序列化代码示例
假设你的列表类型是List<YourDataType>,文本框是txtDisplay,可以这样写:
using (var fs = new FileStream("yourfile.dat", FileMode.Open)) { var formatter = new BinaryFormatter(); txtDisplay.Clear(); // 循环读取直到文件流结束 while (fs.Position < fs.Length) { var list = (List<YourDataType>)formatter.Deserialize(fs); // 遍历当前列表并写入文本框 foreach (var item in list) { txtDisplay.AppendText(item.ToString() + Environment.NewLine); } txtDisplay.AppendText("--- 分割线(下一个列表)---" + Environment.NewLine); } }
关键注意点
- 序列化时要确保是依次将每个列表单独序列化到同一个文件,而不是把多个列表放到一个大列表里再序列化(如果是后者,反序列化一次就能拿到所有数据)。
- 反序列化时必须检查文件流的
Position是否小于Length,因为每次Deserialize会自动移动流的位置,直到流末尾就停止循环。 - 注意
BinaryFormatter的安全性问题,虽然你被要求使用,但如果文件来源不可信,会有风险。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

