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

本文关键字:加载 数据 文件 反序列化 | 更新日期: 2023-09-27 18:29:24

我使用二进制格式化程序来保存/加载文件中的数据。我有一个库系统,有两个具体的类UsersItems,还有一个abstract类library。我还使用了两个列表:

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...");

储蓄似乎很有效。然而,加载不是。我收到以下错误消息:

附加信息:无法强制转换类型为"System.Collections.Generic.List 1[LibrarySystem.User]' to type 'System.Collections.Generic.List 1[LibrySystem.Item]"的对象。

谢谢!

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

您的Serialize方法中有一个奇怪的代码。您正在将value参数保存到两个路径:"itemList"answers"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对象的列表——这正是错误告诉您的内容。

修复是显而易见的,只需使用传递的路径,但是您应该考虑一个更健壮的状态存储系统。例如,您可以有一个同时包含两个列表的类,并对其进行序列化。

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