反序列化 - 从文件加载数据
Deserialize - Loading data from a file
我正在使用二进制格式化程序 save/load 文件中的数据。我有一个图书馆系统,有两个具体的 classes - Users
和 Items
- 和一个 abstract
class - 图书馆。我也在使用两个列表:
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...");
保存似乎工作正常。然而加载不是。我收到此错误消息:
Additional information: Unable to cast object of type 'System.Collections.Generic.List1[LibrarySystem.User]' to type 'System.Collections.Generic.List
1[LibrarySystem.Item]'.
谢谢!
您的 Serialize
方法中有一段奇怪的代码。您正在将 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);
}
}
您将 value
存储在 userList
和 itemList
中,尽管将路径作为参数传递。由于最后一次调用是 Library.Serialize(Library.myUsers, pathUser1)
,itemList
中的内容是 User
个对象的列表——正是错误告诉您的内容。
修复很明显,只需使用传递的路径,但是您应该考虑更强大的状态存储系统。例如,您可以有一个包含两个列表的 class 并对其进行序列化。
并跳过一些相对明显的改进(Deserialize
是通用函数的主要候选者,因此您不必每次都强制转换它),一个重要的注意事项是 NotImplementedException
不是您可以添加自己的意思的含糊不清的东西,它在 .Net 框架的上下文中具有非常精确的含义,并且这是您的代码中的一个函数,由于各种原因您没有实现。您想要的 "generic" 例外是 ArgumentException
或 InvalidOperationException
.
我正在使用二进制格式化程序 save/load 文件中的数据。我有一个图书馆系统,有两个具体的 classes - Users
和 Items
- 和一个 abstract
class - 图书馆。我也在使用两个列表:
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...");
保存似乎工作正常。然而加载不是。我收到此错误消息:
Additional information: Unable to cast object of type 'System.Collections.Generic.List
1[LibrarySystem.User]' to type 'System.Collections.Generic.List
1[LibrarySystem.Item]'.
谢谢!
您的 Serialize
方法中有一段奇怪的代码。您正在将 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);
}
}
您将 value
存储在 userList
和 itemList
中,尽管将路径作为参数传递。由于最后一次调用是 Library.Serialize(Library.myUsers, pathUser1)
,itemList
中的内容是 User
个对象的列表——正是错误告诉您的内容。
修复很明显,只需使用传递的路径,但是您应该考虑更强大的状态存储系统。例如,您可以有一个包含两个列表的 class 并对其进行序列化。
并跳过一些相对明显的改进(Deserialize
是通用函数的主要候选者,因此您不必每次都强制转换它),一个重要的注意事项是 NotImplementedException
不是您可以添加自己的意思的含糊不清的东西,它在 .Net 框架的上下文中具有非常精确的含义,并且这是您的代码中的一个函数,由于各种原因您没有实现。您想要的 "generic" 例外是 ArgumentException
或 InvalidOperationException
.