【问题标题】:How do I load a file into list then in to a listbox using FileStream C#?如何使用 FileStream C# 将文件加载到列表中然后加载到列表框中?
【发布时间】:2015-12-29 18:15:53
【问题描述】:

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();
     }
 }

有一个错误,但我看不到,请帮助我尝试了很多可能的解决方案,但直到现在都没有

【问题讨论】:

  • "有一个错误但我看不到" -- 错误信息是什么?
  • 您应该能够一次对整个employeeList 进行反序列化。尤其是使用 BinaryFormatter 逐条记录可能是个问题; 然后 而不是将项目复制到列表框中,只需将员工列表用作数据源。从图片上看,您似乎序列化了员工对象以外的其他东西——也许是列表框项目?没看到不能说SaveData
  • 如果您检查图片,您将显示错误消息
  • 但是错误消息(应该是 in 帖子)表明您序列化的类型与您尝试反序列化的类型不同。如果我们可以看到 SaveData,我们可以确定
  • private void SaveData() { FileStream outFile; BinaryFormatter bformatter = new BinaryFormatter(); if (lstEmployees.Items.Count > 0) { outFile = new FileStream(filename, FileMode.Create, FileAccess.Write); for (int i = 0; i

标签: c# load external filestream


【解决方案1】:

错误消息Unable to cast object of type System.String to type Assignment.IpayableStaff 非常清楚地表明您序列化的类型与反序列化的类型不同。

此外,当整个列表可以一次全部反序列化时,一次序列化一条记录是一个坏主意。

评论更新:...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);
}

保存/加载方法:

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 知道类型序列化,因为它将类型元数据写入文件。这会导致您遇到错误,通过一一执行,您可以轻松地删除文件,尝试只保存一条记录而不是每次都保存。

【讨论】:

  • 非常感谢,感谢您给我的帮助,虽然没有成功....但非常感谢 - 别担心,我会从这里拿走并尝试找到错误并修复它。谢谢冥王星
猜你喜欢
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多