反序列化-从文件加载数据
本文关键字:加载 数据 文件 反序列化 | 更新日期: 2023-09-27 18:29:24
我使用二进制格式化程序来保存/加载文件中的数据。我有一个库系统,有两个具体的类Users
和Items
,还有一个abstract
类library。我还使用了两个列表:
List<Item> items = new List<Item>();
List<User> users = new List<User>();
public static void Serialize(object value, string path)
{
BinaryFormatter formatter = new BinaryFormatter();
using (Stream fStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
{
formatter.Serialize(fStream, value);
}
}
public static object Deserialize(string path)
{
if (!System.IO.File.Exists(path)) { throw new NotImplementedException(); }
BinaryFormatter formatter = new BinaryFormatter();
using (Stream fStream = File.OpenRead(path))
{
return formatter.Deserialize(fStream);
}
}
}
以上是我用来保存和加载的两种方法。
要从程序文件调用它们,我使用以下代码进行保存:
string pathItem1 = @"itemList";
string pathUser1 = @"userList";
Library.Serialize(Library.myItems, pathItem1);
Library.Serialize(Library.myUsers, pathUser1);
Console.WriteLine("Serializing...");
这个加载代码:
string pathItem = @"itemList";
string pathUser = @"userList";
//var deserializedItem
List<Item> items= (List<Item>)Library.Deserialize(pathItem);
//var deserializedUser =
List<User> users = (List<User>)Library.Deserialize(pathUser);
Console.WriteLine("Deserializing...");
储蓄似乎很有效。然而,加载不是。我收到以下错误消息:
附加信息:无法强制转换类型为"System.Collections.Generic.List
1[LibrarySystem.User]' to type 'System.Collections.Generic.List
1[LibrySystem.Item]"的对象。
谢谢!
您的Serialize
方法中有一个奇怪的代码。您正在将value
参数保存到两个路径:"itemList"answers"userList"。实际上,您并没有使用路径参数。你的代码应该是这样的:
public static void Serialize(object value, string path)
{
BinaryFormatter formatter = new BinaryFormatter();
using (Stream fStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
{
formatter.Serialize(fStream, value);
}
}
有了这个实现,您的代码将按预期工作。
public static void Serialize(object value, string path)
{
BinaryFormatter formatter = new BinaryFormatter();
using (Stream fStream = new FileStream(@"itemList", FileMode.Create, FileAccess.Write, FileShare.None))
{
formatter.Serialize(fStream, value);
}
using (Stream fStream = new FileStream(@"userList", FileMode.Create, FileAccess.Write, FileShare.None))
{
formatter.Serialize(fStream, value);
}
}
尽管将路径作为参数传递,但仍将value
存储在userList
和itemList
中。由于最后一个调用是Library.Serialize(Library.myUsers, pathUser1)
,所以itemList
中的内容是User
对象的列表——这正是错误告诉您的内容。
修复是显而易见的,只需使用传递的路径,但是您应该考虑一个更健壮的状态存储系统。例如,您可以有一个同时包含两个列表的类,并对其进行序列化。
跳过一些相对明显的改进(例如,Deserialize
是泛型函数的主要候选者,因此您不必每次都对其进行强制转换),一个重要的注意事项是,NotImplementedException
不是一个模糊的东西,您可以将自己的含义附加到它上,它在.Net框架的上下文中具有非常精确的含义,这是代码中的一个函数,由于各种原因您没有实现它。您想要的"通用"异常是ArgumentException
或InvalidOperationException
。