反序列化 - 从文件加载数据

时间:2016-01-06 16:53:30

标签: c# serialization deserialization binaryformatter

我正在使用二进制格式化程序来保存/加载文件中的数据。我有一个图书馆系统,有两个具体的课程 - 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]'的对象。

谢谢!

2 个答案:

答案 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);
    }
}

尽管将路径作为参数传递,您仍然会在valueuserList中存储itemList。由于上次调用是Library.Serialize(Library.myUsers, pathUser1)itemList中的内容是User个对象的列表 - 正是错误告诉您的内容。

修复很明显,只需使用传递的路径,但是你应该考虑一个更健壮的状态存储系统。例如,您可以拥有一个包含两个列表的类,并将其序列化。

跳过一些相对明显的改进(Deserialize是一个通用函数的主要候选者,所以你不必每次都抛出它),一个重要的注意事项是{{1你不能理解自己的意思,它在.Net框架的上下文中具有非常精确的含义,并且你的代码中没有实现的功能是你没有实现的由于各种原因。 &#34;泛型&#34;您想要的例外是NotImplementedExceptionArgumentException