如何使用 FileStream C# 将文件加载到列表中然后加载到列表框中?

How do I load a file into list then in to a listbox using FileStream C#?

enter image description here

上面的图片只是下面的代码,你可以使用其中任何一个来帮助我解决目前的噩梦。谢谢小伙子们

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/IPayableStaffToString() 覆盖中使用什么,都会在列表框(和调试!)中显示:

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 知道序列化的类型,因为它将类型元数据写入文件。这会导致您遇到错误,并且通过一个接一个地执行此操作,您可以很容易地破坏文件,试图每次只保存一条记录而不是所有记录。