C# 如何使用反序列化从流中获取特定对象
我刚刚阅读了关于使用BinaryFormatter(SoapFormatter)进行序列化/反序列化的内容,并编写了一些代码来检查此进程的行为: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
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);