使用 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 序列化和反序列化 List<List<object>>

基本上

,BinaryFormatter是一个笑话。它在某些情况下有效,但由于未知原因,在几乎相同的情况下会失败。

BinaryFormatter的最佳和优越替代方案是由Marc Gravel开发的第三方库protobuf-net(https://github.com/mgravell/protobuf-net)。

这种美女一口气解决了我遇到的所有问题。设置起来要容易得多,并且对复杂的自定义类做出更完美的反应。

我还应该提到,在反序列化方面,它更快。

为了修复导致错误"流读取(反序列化)到达流末尾"的问题,流位置需要重置为 0,如下所示...

stream.Position = 0;

我还需要指定一些东西吗...

[可序列化] 公共类 CustomClass { .... }

不。。。这对你正在做的事情应该有好处。

在自定义类中使其工作?我可以不反序列化列表吗> 每次都包含不同类型的对象?

您应该能够序列化任何对象。

相关文章: