使用 BinaryFormatter 序列化和反序列化 List>
本文关键字:List object 反序列化 BinaryFormatter 序列化 使用 | 更新日期: 2023-09-27 18:31:45
假设我有
List<object> mainList = new List<object>();
它包含
List<string> stringList = new List<string();
List<CustomClass> custList = new List<CustomClass>();
mainList.Add(stringList);
mainList.Add(custList);
序列化
Stream stream;
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, mainList);
反序列化
Stream stream = (Stream)o;
BinaryFormatter formatter = new BinaryFormatter();
List<object> retrievedList = (List<object>)formatter.Deserialize(stream);
此时,我收到一个错误,指出流读取(反序列化)到达流的末尾而没有检索值。
我还需要指定一些东西吗...
[Serializable]
public class CustomClass { .... }
在自定义类中使其工作?我不能反序列化每次都包含不同类型对象的 List>吗?
我试过了
IList list = (IList)Activator.CreateInstance(typeof(custClassList[0]))
并尝试发送和接收此内容,但遇到了相同的问题。
但是,我可以序列化和反序列化指定的类型或列表,但我确实需要它是动态的。
基本上
,BinaryFormatter是一个笑话。它在某些情况下有效,但由于未知原因,在几乎相同的情况下会失败。
BinaryFormatter的最佳和优越替代方案是由Marc Gravel开发的第三方库protobuf-net(https://github.com/mgravell/protobuf-net)。
这种美女一口气解决了我遇到的所有问题。设置起来要容易得多,并且对复杂的自定义类做出更完美的反应。
我还应该提到,在反序列化方面,它更快。
为了修复导致错误"流读取(反序列化)到达流末尾"的问题,流位置需要重置为 0,如下所示...
stream.Position = 0;
我还需要指定一些东西吗...
[可序列化] 公共类 CustomClass { .... }
不。。。这对你正在做的事情应该有好处。
在自定义类中使其工作?我可以不反序列化列表吗> 每次都包含不同类型的对象?
您应该能够序列化任何对象。