从二进制文件中提取对象并放入List <t> </t>

时间:2014-01-12 22:01:14

标签: c# serialization deserialization

我以前做过这件事,但无法弄清楚我是怎么做到的。我有一个二进制文件,我想存储对象。我已经使用[Serializable]序列化了对象类,并已成功将单个对象保存到文件中。但是,在尝试读取对象并放入List<>进行进一步处理时,问题就会出现。

因此,当试图从文件中读取对象时,我有代码:

List<myStuff> aListOfStuff = new List<myStuff>();
Stream fileStream = File.OpenRead("MyFile.DAT");
BinaryFormatter deserializer = new BinaryFormatter();
aListOfStuff = (List<myStuff>)deserializer.Deserialize(fileStream);
fileStream.Close();

当我第一次开始测试时,上面的代码没有生成错误,但是当我尝试写入文件时,我会收到一个异常,因为它正被另一个进程使用而无法访问该文件。在尝试通过注释掉试图检查文件中已存在的内容并且仅保存&amp;刷新代码激活,我会在上面的aListofStuff代码行中收到错误,声明“无法将类型为'myStuff'的对象强制转换为'System.Collections.Generic.List'1.是的,1是错误而不是拼写错误。这告诉我之所以得到“文件仍然打开”的消息是因为.Close()没有被调用,但这仍然无法帮助我找到问题的根源。

所以我假设我只是不知道/记得如何从文件中拉回一个对象列表。我在网上搜索了如何执行此操作,但无法找到有关特定于对象列表的信息。文件中单个序列化对象的大量内容,但不超过一个,我发现的序列化文章似乎没有扩展。

这是我用来向文件中添加对象的代码:

myStuff newThing = new myStuff(string1, string2, string3);
Stream fileStream = File.Open("MyFile.Dat", FileMode.Append);
BinaryFormatter serializer = new BinaryFormatter();
serializer.Serialize(fileStream, newThing);
fileStream.Close();

1 个答案:

答案 0 :(得分:1)

“无法将'myStuff'类型的对象强制转换为'System.Collections.Generic.List'1。

这意味着您已序列化为File one myStuff对象,而不是对象列表。检查一下。你还提供Cna序列化代码吗?

UPDATE2:

序列化:

var list = new List<myStuff>();
var objectOne = new myStuff(string1, string2, string3);
// more object here
list.Add(objectOne);
// list.Add other objects there

using(Stream fileStream = File.Open("MyFile.Dat", FileMode.Create))
{
  BinaryFormatter serializer = new BinaryFormatter();
  serializer.Serialize(fileStream, list);
}

要反序列化:

List<myStuff> list;
using(Stream fileStream = File.OpenRead("MyFile.DAT"))
{
  BinaryFormatter deserializer = new BinaryFormatter();
  list = (myStuffList<myStuff>)deserializer.Deserialize(fileStream);
}