【发布时间】:2015-03-07 00:10:33
【问题描述】:
我正在为我学校的游泳课组织构建一个程序,我正在使用 XML 序列化保存数据,但每次尝试反序列化数据时都会收到错误消息,它显示“运行时错误:尝试反序列化一个空流。”
这是我反序列化文件并将其放入窗口的代码。
public StudentProfile()
{
InitializeComponent();
using (var file = File.Open(FindStudent.studentName + ".xml", FileMode.OpenOrCreate))
{
var bformatter = new BinaryFormatter();
var mp = (Person)bformatter.Deserialize(file);
file.Close();
nameBox.Text += mp.studentName;
parentBox.Text += mp.parentName;
yearBox.Text += mp.year;
semesterBox.Text += mp.semester;
sessionBox.Text += mp.session;
ageGroupBox.Text += mp.ageGroup;
sessionTimeBox.Text += mp.sessionTime;
levelBox.Text += mp.level;
paymentTypeBox.Text += mp.paymentType;
amountBox.Text += mp.amount;
checkNumberBox.Text += mp.checkNumber;
datePaidBox.Text += mp.datePaid;
}
}
我在这里尝试了一些解决方案,BinaryFormatter: SerializationException,但它仍然不起作用。你们能帮帮我吗?
编辑:我用不同的方法解决了我的错误,这是我最终用来反序列化它的代码。如果有人要序列化代码,那我给它
Stream file = File.Open(@"C:\Swimmers\" + FindStudent.studentName + ".xml", FileMode.Open);
BinaryFormatter bformatter = new BinaryFormatter();
Person mp = (Person)bformatter.Deserialize(file);
file.Close();
nameBox.Text += mp.studentName;
parentBox.Text += mp.parentName;
yearBox.Text += mp.year;
semesterBox.Text += mp.semester;
sessionBox.Text += mp.session;
ageGroupBox.Text += mp.ageGroup;
sessionTimeBox.Text += mp.sessionTime;
levelBox.Text += mp.level;
paymentTypeBox.Text += mp.paymentType;
amountBox.Text += mp.amount;
checkNumberBox.Text += mp.checkNumber;
datePaidBox.Text += mp.datePaid;
}
【问题讨论】:
-
你为什么使用“OpenOrCreate”标志?如果该文件不存在,它不应该创建一个您下次会偶然发现的虚假空文件,对吧?除此之外,我认为您展示的代码太少,以至于人们无法真正提供帮助。可能不存在任何文件(在该文件夹中),也可能是 Person 类定义在序列化属性方面搞砸了。可能是序列化代码有问题。没有一个是可见的。
-
您为什么要使用
BinaryFormatter来处理带有.xml扩展名的文件?虽然无论名称如何,都可以将二进制数据存储在任何文件中,但使用 .xml 之类的标准扩展名(人们希望在其中找到 XML 数据)似乎可能会导致未来出现问题。 -
错误信息可能是正确的。你实际上没有问过问题。我们有什么具体的技术问题?
-
我假设如果您检查
File.exists(student.xml),您会发现该文件不存在,正如消息所暗示的那样。
标签: c# serialization