如何使用 FileStream C# 将文件加载到列表中然后加载到列表框中?
How do I load a file into list then in to a listbox using FileStream C#?
上面的图片只是下面的代码,你可以使用其中任何一个来帮助我解决目前的噩梦。谢谢小伙子们
List<IpayableStaff> employeeList = new List<IpayableStaff>();
private void LoadData()
{
FileStream inFile;
BinaryFormatter bformatter = new BinaryFormatter();
if (File.Exists(filename))
{
inFile = new FileStream(filename, FileMode.Open, FileAccess.Read);
while (inFile.Position < inFile.Length)
{
IpayableStaff load = (IpayableStaff)bformatter.Deserialize(inFile);
employeeList.Add(load);
lstEmployees.Items.Add(load);
}
inFile.Close();
}
}
private void SaveData()
{
FileStream outFile;
BinaryFormatter bformatter = new BinaryFormatter();
if (lstEmployees.Items.Count > 0)
{
//opening the file in order to write in to it
outFile = new FileStream(filename, FileMode.Create, FileAccess.Write);
for (int i = 0; i < lstEmployees.Items.Count; i++)
{
//write on file via serialization
bformatter.Serialize(outFile, lstEmployees.Items[i]);
}
//closing the file
outFile.Close();
}
}
有错误但我看不到,请帮助我已经尝试了很多可能的解决方案,但直到现在都没有
错误消息 Unable to cast object of type System.String to type Assignment.IpayableStaff
非常清楚地表明您序列化的类型与反序列化的类型不同。
此外,一次序列化一条记录是一个坏主意,因为整个列表可以一次 de/serialized。
评论更新:...bformatter.Serialize(outFile, lstEmployees.Items[i]);
您正在序列化 ListBox
个对象(一个接一个),然后尝试将它们反序列化为其他对象 (IPayableStaff
)。您 可能 已将 IPayableStaff
存储到 Items
(代码我们看不到),但是在序列化时您没有将它们强制转换回来。
补救措施
// some data
critters = new List<Animal>();
string file = @"C:\Temp\Animals.bin";
Animal animal = new Animal("ziggy","feline", 3.14);
critters.Add(animal);
critters.Add(new Animal("rover", "canine", 1.23));
critters.Add(new Animal("Gizmo", "muhwai", .56));
SaveData(file, critters);
List<Animal> newALst = LoadData(file);
// use the List<T> as listbox datasource
lb1.DataSource = newALst;
无论您在 Animal/IPayableStaff
的 ToString()
覆盖中使用什么,都会在列表框(和调试!)中显示:
public override string ToString()
{
return string.Format("{0} ({1})",Name, Species);
}
Save/Load 方法:
private void SaveData(string fil, List<Animal> animalList)
{
// serialize entire list
using (FileStream fs = new FileStream(fil, FileMode.OpenOrCreate))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, animalList);
}
}
private List<Animal> LoadData(string filename)
{
List<Animal> newLst = new List<Animal>();
// deserialize entire list and return it
using (FileStream fs = new FileStream(filename, FileMode.Open))
{
BinaryFormatter bf = new BinaryFormatter();
newLst= (List<Animal>)bf.Deserialize(fs);
}
return newLst;
}
BinaryFormatter
知道序列化的类型,因为它将类型元数据写入文件。这会导致您遇到错误,并且通过一个接一个地执行此操作,您可以很容易地破坏文件,试图每次只保存一条记录而不是所有记录。
上面的图片只是下面的代码,你可以使用其中任何一个来帮助我解决目前的噩梦。谢谢小伙子们
List<IpayableStaff> employeeList = new List<IpayableStaff>();
private void LoadData()
{
FileStream inFile;
BinaryFormatter bformatter = new BinaryFormatter();
if (File.Exists(filename))
{
inFile = new FileStream(filename, FileMode.Open, FileAccess.Read);
while (inFile.Position < inFile.Length)
{
IpayableStaff load = (IpayableStaff)bformatter.Deserialize(inFile);
employeeList.Add(load);
lstEmployees.Items.Add(load);
}
inFile.Close();
}
}
private void SaveData()
{
FileStream outFile;
BinaryFormatter bformatter = new BinaryFormatter();
if (lstEmployees.Items.Count > 0)
{
//opening the file in order to write in to it
outFile = new FileStream(filename, FileMode.Create, FileAccess.Write);
for (int i = 0; i < lstEmployees.Items.Count; i++)
{
//write on file via serialization
bformatter.Serialize(outFile, lstEmployees.Items[i]);
}
//closing the file
outFile.Close();
}
}
有错误但我看不到,请帮助我已经尝试了很多可能的解决方案,但直到现在都没有
错误消息 Unable to cast object of type System.String to type Assignment.IpayableStaff
非常清楚地表明您序列化的类型与反序列化的类型不同。
此外,一次序列化一条记录是一个坏主意,因为整个列表可以一次 de/serialized。
评论更新:...bformatter.Serialize(outFile, lstEmployees.Items[i]);
您正在序列化 ListBox
个对象(一个接一个),然后尝试将它们反序列化为其他对象 (IPayableStaff
)。您 可能 已将 IPayableStaff
存储到 Items
(代码我们看不到),但是在序列化时您没有将它们强制转换回来。
补救措施
// some data
critters = new List<Animal>();
string file = @"C:\Temp\Animals.bin";
Animal animal = new Animal("ziggy","feline", 3.14);
critters.Add(animal);
critters.Add(new Animal("rover", "canine", 1.23));
critters.Add(new Animal("Gizmo", "muhwai", .56));
SaveData(file, critters);
List<Animal> newALst = LoadData(file);
// use the List<T> as listbox datasource
lb1.DataSource = newALst;
无论您在 Animal/IPayableStaff
的 ToString()
覆盖中使用什么,都会在列表框(和调试!)中显示:
public override string ToString()
{
return string.Format("{0} ({1})",Name, Species);
}
Save/Load 方法:
private void SaveData(string fil, List<Animal> animalList)
{
// serialize entire list
using (FileStream fs = new FileStream(fil, FileMode.OpenOrCreate))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, animalList);
}
}
private List<Animal> LoadData(string filename)
{
List<Animal> newLst = new List<Animal>();
// deserialize entire list and return it
using (FileStream fs = new FileStream(filename, FileMode.Open))
{
BinaryFormatter bf = new BinaryFormatter();
newLst= (List<Animal>)bf.Deserialize(fs);
}
return newLst;
}
BinaryFormatter
知道序列化的类型,因为它将类型元数据写入文件。这会导致您遇到错误,并且通过一个接一个地执行此操作,您可以很容易地破坏文件,试图每次只保存一条记录而不是所有记录。