gpt4 book ai didi

c# - 解析完成前遇到流结尾

转载 作者:太空宇宙 更新时间:2023-11-03 21:19:37 24 4
gpt4 key购买 nike

我正在尝试使用以下代码从一个文件中读取多个对象:

List<Alarm> list = new List<Alarm>();
BinaryFormatter serializer = new BinaryFormatter();

using (FileStream stream = File.OpenRead("//my File here"))
{
while (stream.Position < stream.Length)
{
list.Add((Alarm)serializer.Deserialize(stream));
}
}

但是,每次我尝试运行此代码时,都会收到类似“在解析完成之前遇到流结束”的错误。请注意,已经有一个线程建议在每次迭代后将流位置设置为 0,但这显然对我不起作用,否则我会陷入无限循环。

我在这里做错了什么?如果我省略 while 循环,代码本身就可以工作,但显然在一个包含多个对象的文件中,我不只是想从我的文件中获取一个,而是所有的。

有什么建议吗?

编辑:按需:

序列化。

//Fetches Data from my GUI, creates a valid Alarm object
Alarm alarm = new Alarm(this.noticeBox.Text, date.Year, date.Month, date.Day, (int)this.hourPicker.Value, (int)this.minutePicker.Value);

var serializer = new BinaryFormatter();

using (FileStream stream = "//file"))
{
serializer.Serialize(stream, alarm);
}

最佳答案

如果您序列化的是 Alarm 列表(而不是一系列单独的 Alarm),这很有可能,那么您只需要反序列化:

using (FileStream stream = File.OpenRead("//my File here"))
{
list = (List<Alarm>)serializer.Deserialize(stream));
}

否则,如果您序列化了独立的 Alarm 对象,您的代码应该可以工作(它们中的每一个本身都是一个对象图,但似乎并非如此)

编辑:您发布的所有内容似乎都没有问题。我在这里添加了一个 fiddle ( https://dotnetfiddle.net/bGWOOO ),它演示了您正在使用的方法是如何工作的(出于显而易见的原因,我使用了 MemoryStream 而不是 FileStream ,但它应该没关系)。所以还有其他问题:流没有被正确写入磁盘,或者没有被正确读取,但这肯定与您发布的代码无关。

更新

只是为了进一步引用为什么选择这个答案(因为真正的答案在评论/聊天中):

在序列化程序中,您每次都在创建文件并替换内容(问题中未显示,但在评论中猜到了),因此答案正确地附加到文件中,如下所示:

using (FileStream stream = new FileStream("** path to file here**", FileMode.Append,  FileAccess.Write, FileShare.Write))
{
// write the serialized data to the stream
}

关于c# - 解析完成前遇到流结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31707985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com