C# 反序列化-从文件加载数据
我正在使用二进制格式化程序保存/加载文件中的数据。我有一个图书馆系统,有两个具体的类——C# 反序列化-从文件加载数据,c#,serialization,deserialization,binaryformatter,C#,Serialization,Deserialization,Binaryformatter,我正在使用二进制格式化程序保存/加载文件中的数据。我有一个图书馆系统,有两个具体的类——Users和Items——和一个abstract类库。我还使用了两个列表: List<Item> items = new List<Item>(); List<User> users = new List<User>(); public static void Serialize(object value, string path) {
Users
和Items
——和一个abstract
类库。我还使用了两个列表:
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 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...");
string pathItem=@“itemList”;
字符串pathUser=@“userList”;
//var反序列化
列表项=(列表)库。反序列化(路径项);
//var反序列化数据采集器=
列表用户=(列表)库。反序列化(路径用户);
WriteLine(“反序列化…”);
储蓄似乎很管用。然而,加载不是。我收到以下错误消息:
其他信息:无法将类型为“System.Collections.Generic.List1[LibrarySystem.User]”的对象强制转换为类型为“System.Collections.Generic.List
1[LibrarySystem.Item]”
谢谢 您的
序列化方法中有一个奇怪的代码。您正在将value
参数保存到两个路径:“itemList”和“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);
}
}
您在userList
和itemList
中存储value
,尽管路径作为参数传递。由于最后一个调用是Library.Serialize(Library.myUsers,pathUser1)
,因此itemList
中的是User
对象的列表,这正是错误告诉您的
修复是显而易见的,简单地使用经过的路径,但是你应该考虑一个更健壮的状态存储系统。例如,您可以拥有一个同时包含两个列表的类,并将其序列化
跳过几个相对明显的改进(例如,反序列化
是泛型函数的主要候选者,因此您不必每次都强制转换它),一个重要的注意事项是,NotImplementedException
不是一个模糊的东西,您可以根据自己的意思来确定,它在.Net framework的上下文中有非常精确的含义,而这是代码中的一个函数,由于各种原因您没有实现它。您想要的“通用”异常是ArgumentException
或invalidooperationexception
代码现在运行时没有任何错误。但是,在加载时,保存后实际上没有从文件中加载任何内容!这很奇怪,因为我用简单的示例检查了这段代码,集合(我用1和2个元素检查了它)实际上是反序列化的。您可以在调用Serialize方法后检查文件是否存在,还可以检查文件内容(如果文件不是空的/0字节,这就足够了)。然后您可以逐行调试代码,以确保您的文件可以通过反序列化方法访问。另外,如果您正在从Library.myUsers
保存数据,是否要将其加载到同一个变量?然后,使用Library.myUsers=(List)Library.Deserialize(pathUser)代码>谢谢Vadim Martynov与库完美配合。myUsers=(列表)库。反序列化(pathUser)!真的很感激,伙计:)!再次感谢!我把代码改成了@vadim martynov告诉我的方式。代码现在可以正常工作了,没有任何错误。但是,在加载时,保存后实际上没有从文件中加载任何内容还将NotImplementedException更改为ArgumentException。
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);
}
}