【问题标题】:How can i know that the Stream is end?我怎么知道 Stream 结束了?
【发布时间】:2011-06-30 11:12:22
【问题描述】:

我正在使用序列化写入将一些联系人及其姓名和电话附加到文件中,我通过将每个联系人附加到文件中来单独写入。

我想从文件中读取这些联系人并将它们放在 ListView 中。

Stream stream = File.Open("Contacts.dat", FileMode.Open);
BinaryFormatter BFormatter = new BinaryFormatter();
Contacts contact = (Contacts)BFormatter.Deserialize(stream);
listView1.Items.Add(new ListViewItem(new string[] { "", contact.name, contact.phone }));

执行上述代码后,我只得到一个联系人,如果我再次反序列化流,我会得到下一个联系人

Contacts contact2 = (Contacts)BFormatter.Deserialize(stream);
listView1.Items.Add(new ListViewItem(new string[] { "", contact2.name, contact2.phone}));

如何读取所有联系人? 或者我怎么知道流已经结束?

【问题讨论】:

  • 我建议查看 BFormatter 类的文档。这个类不是.net的一部分
  • 为什么他自己的课程与问题相关?
  • 这与 Deserialize 方法从流中获取数据的方式有关。这应该告诉他他需要如何退出从流中获取所有联系的循环。
  • 考虑序列化一个数组或 List。如果这不合适,那么您必须从流属性中检测文件结尾。
  • List 不起作用......可能是因为我每次都附加序列化的联系人......然后每次在新联系人中添加序列化的标题......我是不确定但我试了一下,得到一个错误“无法投射”

标签: c# .net stream


【解决方案1】:

假设您指的是文件流,您可以对照流Length 属性检查流Position 属性

【讨论】:

  • 但是当我打开文件时,我可以看到数据?!我不希望用户能够读取数据......我该怎么做?
【解决方案2】:

这取决于它是哪种流。例如,NetworkStream 永远不会结束(因为 TCP 是基于流的)。 FileStream 将在 Read 返回 0 字节时结束。

【讨论】:

  • StreamReader 有自己的方法 StreamReader.EndOfStream();
  • @Cody:它只是流的一个包装器,并使用流来检测结束。
  • 不,我不能在序列化中使用 StreamReader.. 我可以吗?
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2015-12-31
  • 2012-08-29
  • 1970-01-01
相关资源
最近更新 更多