我正在使用二进制格式化程序来保存/加载文件中的数据。我有一个图书馆系统,有两个具体的课程 - data_db = [
{ "id": 1, "status_code": 2, "desc": "Description sample1" },
{ "id": 2, "status_code": 4, "desc": "Description sample2" },
{ "id": 3, "status_code": 5, "desc": "Description sample3" },
{ "id": 4, "status_code": 5, "desc": "Description sample4" }
]
data_api = [
{ "status_code": 1, "desc": "Description sample5" },
{ "status_code": 4, "desc": "Description sample6" },
{ "status_code": 5, "desc": "Description sample3" }
]
lst = []
for dct in data_api:
for dct2 in data_db:
if all(dct[key] == dct2[key] for key in dct):
break
else:
lst.append(dct)
lst2 = []
for dct2 in data_db:
for dct in data_api:
if all(dct[key] == dct2[key] for key in dct):
break
else:
lst2.append(dct2["id"])
print(lst)
print(lst2)
和Users
- 以及一个Items
课程 - 图书馆。我也使用两个列表:
abstract
以上是我用来保存和加载的两种方法。
要从Program文件中调用它们,我使用此代码进行保存:
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...");
保存似乎工作正常。然而,加载不是。我收到此错误消息:
其他信息:无法转换类型为'System.Collections.Generic.List
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...");
1 [LibrarySystem.Item]'的对象。
谢谢!
答案 0 :(得分:0)
您的Serialize
方法中有一个奇怪的代码。您要将value
参数保存到两个路径中:&#34; itemList&#34;和&#34; userList&#34;。实际上你没有使用路径参数。您的代码应如下所示:
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);
}
}
通过此实现,您的代码将按预期工作。
答案 1 :(得分:0)
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
是一个通用函数的主要候选者,所以你不必每次都抛出它),一个重要的注意事项是{{1你不能理解自己的意思,它在.Net框架的上下文中具有非常精确的含义,并且你的代码中没有实现的功能是你没有实现的由于各种原因。 &#34;泛型&#34;您想要的例外是NotImplementedException
或ArgumentException
。