【问题标题】:Serializing and deserializing a List<List<object>> with BinaryFormatter使用 BinaryFormatter 序列化和反序列化 List<List<object>>
【发布时间】:2013-09-23 10:46:16
【问题描述】:

假设我有

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]))

并尝试发送和接收这个,但遇到了同样的问题。

我可以序列化和反序列化指定类型或列表,但我确实需要它是动态的。

【问题讨论】:

  • 没有Serializable 属性或实现ISerializable 接口你不能用BinaryFormatter 序列化一个类型
  • 这一行只是一个错字吗? List&lt;object&gt; retrievedList = formatter.Serialize(stream); 还是来自您的代码? ;)
  • List&lt;object&gt; retrievedList = formatter.Serialize(stream); 应该是 List&lt;object&gt; retrievedList = (List&lt;object&gt;)formatter.Deserialize(stream); 以便编译。我认为这是一个错字。改正
  • Sriram Sakthivel 建议的内容 ;) 但如果您在问题中发布它,您的代码甚至无法编译,所以我认为您的意思是 Deserialize 无论如何(当然还有演员表)
  • 还在打电话给Serialize...

标签: c# serialization stream deserialization binaryformatter


【解决方案1】:

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

stream.Position = 0;

除此之外我还需要指定什么吗?

[Serializable] 公共类 CustomClass { .... }

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

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

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

【讨论】:

  • 我试过了。我正在读取由 NamedPipeClientStream 写入的 NamedPipeServerStream,这会给我一个错误,说它“无法搜索”。
【解决方案2】:

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

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

这个美女一口气解决了我所有的问题。它更容易设置并且对复杂的自定义类做出更完美的反应。

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

【讨论】:

  • “通常”更快。我发现如果你有大量的原始数组(例如 int[]),那么 BinaryFormatter 比 Protobuf.Net 更快
  • Protobuf-net(至少是 .net 端口)是由 Marc Gravell 创建的,而不是 google。它恰好托管在 google.code 上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
相关资源
最近更新 更多