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

Deserialize - Loading data from a file

我正在使用二进制格式化程序 save/load 文件中的数据。我有一个图书馆系统,有两个具体的 classes - UsersItems - 和一个 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.List1[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 存储在 userListitemList 中,尽管将路径作为参数传递。由于最后一次调用是 Library.Serialize(Library.myUsers, pathUser1)itemList 中的内容是 User 个对象的列表——正是错误告诉您的内容。

修复很明显,只需使用传递的路径,但是您应该考虑更强大的状态存储系统。例如,您可以有一个包含两个列表的 class 并对其进行序列化。

并跳过一些相对明显的改进(Deserialize 是通用函数的主要候选者,因此您不必每次都强制转换它),一个重要的注意事项是 NotImplementedException 不是您可以添加自己的意思的含糊不清的东西,它在 .Net 框架的上下文中具有非常精确的含义,并且这是您的代码中的一个函数,由于各种原因您没有实现。您想要的 "generic" 例外是 ArgumentExceptionInvalidOperationException.