【问题标题】:Why can't a Dictionary<key,value> be serialized? Or can it?为什么不能序列化 Dictionary<key,value>?或者可以吗?
【发布时间】:2012-01-10 16:17:55
【问题描述】:

(还没有发现问这个的问题)。

为什么字典不能序列化?

大多数资源、网站、博客等都说它不能被序列化。但是阅读“CLR via C#”第 3 版,第 664 页将 Dictionary 作为对象图的示例,可以序列化。

请注意,本章讨论的是二进制序列化。那么是不是可以用BinaryFormatter序列化,却不能用XML序列化?

或者我在 IDictionary 和 Dictionary 之间缺少一些区别?

澄清一下……字典在什么情况下可以序列化,什么情况下不能序列化。

谢谢。

【问题讨论】:

  • 你想用什么序列化?不同的序列化器会以不同的方式对待不同的类型,所以你可以将一个Dictionary&lt;TKey, TValue&gt;序列化为XAML,例如是XML,但你不能用XmlSerializer序列化它...
  • 同样,您提到“二进制序列化”; BinaryFormatter 和 NetDataContractSerializer(以及,就此而言,protobuf-net)都是二进制序列化器,但可能表现不同。 “什么序列化程序”是这里的关键。
  • 那只能用来序列化某些类型吗?我知道序列化“管道”检查对象是否从 IDictionary 派生,然后禁用该对象的序列化。 stackoverflow.com/questions/1573922/…(见第一个答案中的引用)。
  • 除非您先定义“它”,否则我们无法回答这个问题。如果 "it"====XmlSerializer,那么:确实,这将是一个问题。
  • 好的,所以在序列化为 XML 时有限制吗?

标签: .net generics serialization dictionary


【解决方案1】:

我认为这只是 Microsoft 的 XML 序列化程序 (System.Xml.Serialization.XmlSerializer) 的限制。大多数其他序列化程序将支持字典。

这不是序列化的一般限制,甚至不是 xml 序列化,只是该实现的限制。 XmlSerializer 总体来说很弱。

【讨论】:

  • 好的,有趣 - 任何想法为什么限制到位?
【解决方案2】:

Here是这样的原因:

对象是从内向外重构的,反序列化期间调用方法可能会产生不良副作用,因为调用的方法可能引用在调用时尚未反序列化的对象引用。如果被反序列化的类实现了IDeserializationCallback,则当整个对象图被反序列化后,会自动调用OnSerialization方法。至此,所有引用的子对象都已完全恢复。哈希表是不使用上述事件监听器就难以反序列化的类的典型示例。在反序列化过程中很容易检索键/值对,但是将这些对象添加回哈希表可能会导致问题,因为不能保证从哈希表派生的类已被反序列化。因此,不建议在此阶段调用哈希表上的方法。

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 2010-10-02
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多