C# 如何使用反序列化从流中获取特定对象

C# 如何使用反序列化从流中获取特定对象,c#,.net,serialization,deserialization,C#,.net,Serialization,Deserialization,我刚刚阅读了关于使用BinaryFormatter(SoapFormatter)进行序列化/反序列化的内容,并编写了一些代码来检查此进程的行为: class Program { private static List<string> listA = new List<string>() { "ListA-0", "ListA-1" }; private static List<string> listB = new List<string

我刚刚阅读了关于使用BinaryFormatter(SoapFormatter)进行序列化/反序列化的内容,并编写了一些代码来检查此进程的行为:

class Program
{
    private static List<string> listA = new List<string>() { "ListA-0", "ListA-1" };
    private static List<string> listB = new List<string>() { "ListB-0", "ListB-1" };
    private static List<string> listC = new List<string>() { "ListC-0", "ListC-1" };

    private static void SaveApplicationState(Stream stream)
    {
        BinaryFormatter formatter = new BinaryFormatter();

        formatter.Serialize(stream, listA);
        formatter.Serialize(stream, listB);
        formatter.Serialize(stream, listC);
    }

    private static void LoadApplicationState(Stream stream)
    {
        BinaryFormatter formatter = new BinaryFormatter();

        listA = (List<string>)formatter.Deserialize(stream);
        listB = (List<string>)formatter.Deserialize(stream);
        listC = (List<string>)formatter.Deserialize(stream);
    }

    private static void ShowList(string msg)
    {
        Console.WriteLine(msg);

        foreach (var str in listA.Union(listB).Union(listC))
            Console.WriteLine(str);
    }

    static void Main(string[] args)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            ShowList("Before save: ");

            SaveApplicationState(ms);
            ms.Position = 0;
            LoadApplicationState(ms);

            ShowList("After load: ");
        }
    }
}
但是我有一个关于这种行为的问题(如果这是愚蠢的或不正确的,请道歉)

如果我添加新的
列表

但尝试以错误的顺序反序列化:

listA = (List<string>)formatter.Deserialize(stream);
list0 = (List<int>)formatter.Deserialize(stream);
listB = (List<string>)formatter.Deserialize(stream);
listC = (List<string>)formatter.Deserialize(stream);
listA=(列表)格式化程序。反序列化(流);
list0=(列表)格式化程序。反序列化(流);
listB=(列表)格式化程序。反序列化(流);
listC=(列表)格式化程序。反序列化(流);
我会对
铸造
感到异常,我明白为什么会这样


那么,是否可以从
获取特定对象(例如,如果我知道该
类型
或任何其他
属性
)或者我必须对流进行
反序列化
直到结束,并按
序列化的顺序获取每个对象。

您需要将流移动到存储对象的开始位置。您可能需要为此存储一些元数据。有完整源代码的最终解决方案吗?
private static List<int> list0 = new List<int>() { 1, 2 };
formatter.Serialize(stream, list0);
formatter.Serialize(stream, listA);
formatter.Serialize(stream, listB);
formatter.Serialize(stream, listC);
listA = (List<string>)formatter.Deserialize(stream);
list0 = (List<int>)formatter.Deserialize(stream);
listB = (List<string>)formatter.Deserialize(stream);
listC = (List<string>)formatter.Deserialize(stream);