我以前做过这件事,但无法弄清楚我是怎么做到的。我有一个二进制文件,我想存储对象。我已经使用[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();
答案 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);
}