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

C# 反序列化-从文件加载数据,c#,serialization,deserialization,binaryformatter,C#,Serialization,Deserialization,Binaryformatter,我正在使用二进制格式化程序保存/加载文件中的数据。我有一个图书馆系统,有两个具体的类——Users和Items——和一个abstract类库。我还使用了两个列表: List<Item> items = new List<Item>(); List<User> users = new List<User>(); public static void Serialize(object value, string path) {

我正在使用二进制格式化程序保存/加载文件中的数据。我有一个图书馆系统,有两个具体的类——
Users
Items
——和一个
abstract
类库。我还使用了两个列表:

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 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...");
string pathItem=@“itemList”;
字符串pathUser=@“userList”;
//var反序列化
列表项=(列表)库。反序列化(路径项);
//var反序列化数据采集器=
列表用户=(列表)库。反序列化(路径用户);
WriteLine(“反序列化…”);
储蓄似乎很管用。然而,加载不是。我收到以下错误消息:

其他信息:无法将类型为“System.Collections.Generic.List
1[LibrarySystem.User]”的对象强制转换为类型为“System.Collections.Generic.List
1[LibrarySystem.Item]”


谢谢

您的
序列化方法中有一个奇怪的代码。您正在将
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);
    }
}
您在
userList
itemList
中存储
value
,尽管路径作为参数传递。由于最后一个调用是
Library.Serialize(Library.myUsers,pathUser1)
,因此
itemList
中的是
User
对象的列表,这正是错误告诉您的

修复是显而易见的,简单地使用经过的路径,但是你应该考虑一个更健壮的状态存储系统。例如,您可以拥有一个同时包含两个列表的类,并将其序列化


跳过几个相对明显的改进(例如,
反序列化
是泛型函数的主要候选者,因此您不必每次都强制转换它),一个重要的注意事项是,
NotImplementedException
不是一个模糊的东西,您可以根据自己的意思来确定,它在.Net framework的上下文中有非常精确的含义,而这是代码中的一个函数,由于各种原因您没有实现它。您想要的“通用”异常是
ArgumentException
invalidooperationexception

代码现在运行时没有任何错误。但是,在加载时,保存后实际上没有从文件中加载任何内容!这很奇怪,因为我用简单的示例检查了这段代码,集合(我用1和2个元素检查了它)实际上是反序列化的。您可以在调用Serialize方法后检查文件是否存在,还可以检查文件内容(如果文件不是空的/0字节,这就足够了)。然后您可以逐行调试代码,以确保您的文件可以通过反序列化方法访问。另外,如果您正在从
Library.myUsers
保存数据,是否要将其加载到同一个变量?然后,使用
Library.myUsers=(List)Library.Deserialize(pathUser)谢谢Vadim Martynov与库完美配合。myUsers=(列表)库。反序列化(pathUser)!真的很感激,伙计:)!再次感谢!我把代码改成了@vadim martynov告诉我的方式。代码现在可以正常工作了,没有任何错误。但是,在加载时,保存后实际上没有从文件中加载任何内容还将NotImplementedException更改为ArgumentException。
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);
    }
}