【问题标题】:Why is my List<T> not being serialized?为什么我的 List<T> 没有被序列化?
【发布时间】:2010-08-18 09:43:44
【问题描述】:

这与this question 相关,但这次我试图弄清楚如何序列化字典。我有一个继承自 Dictionary 的类,我需要能够对其进行序列化。

序列化方法是这样的,基本上是把字典中的值集合添加到列表中,进行序列化。

[Serializable]
public class Collection: SortedDictionary<Key, Node>, ISerializable
{  
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        List<Node> Nodes = new List<Node>();
        // The "Values" mentioned here is the SortedDictionary's Values collection
        Nodes.AddRange(Values);
        info.AddValue("Nodes", Nodes, Nodes.GetType());
    }

    public Collection(SerializationInfo info, StreamingContext context)
        : base(new Key.Comparer())
    {
        List<Node> SerValues = (List<Node>)info.GetValue("Nodes", typeof(List<Node>));
        foreach (Node ThisNode in SerValues)
        {
            // This add method has been extended so that it automatically generates the key.
            Add(ThisNode);
        }
    }
}

但是,当我调用反序列化构造函数时,列表包含正确数量的值,只是空值。

我怀疑这是因为节点还没有被反序列化(我知道它们可以被序列化),但是我该如何解决这个问题呢?

【问题讨论】:

  • 没有理由不应该工作。您是否尝试过单独添加节点以查看是否有效?
  • 我可以,但是我将如何检索节点,因为当我将它们添加到 SerializationInfo 时它们都需要一个密钥。如果没有问题,可能还有其他一些我没有提到的影响序列化的因素。

标签: c# list serialization tree


【解决方案1】:

您是否尝试对字典进行 Xml 序列化/反序列化?这就是您实现 ISerializable 接口并改用 SerializationInfo 的原因吗?

虽然 Xml 序列化程序不支持通用字典类型,但 DataContractSerializer 支持,也许您可​​以尝试使用它?如果做不到这一点,这是一个 Xml 可序列化字典的实现,可能值得一看:

http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx

【讨论】:

    【解决方案2】:

    您是否尝试在您的集合类上使用[Serializable] 属性?结果一样吗?

    (你为什么使用 ISerializable 而不是属性?)

    【讨论】:

    • 我也确实使用了 [Serializable] 属性(我已将其添加到帖子中)。我需要 ISerializable,这样我就可以更改字典的序列化方式,因为它们通常不能。
    • @fneep: 字典不能正常序列化是什么意思?
    • 这很奇怪,互联网让我相信字典不能被连载。尝试谷歌搜索“c#序列化字典”。即便如此,为什么这不起作用?
    【解决方案3】:

    如果我没记错的话,字典是不可序列化的。

    是的: http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/5115ff4c-75a6-4a96-9c6b-b840e04c650d/

    这也意味着仅仅从它继承并调用子 Serializable 是行不通的。您将不得不使用不同的容器 - 通常是自定义类键/值容器的数组 - 没什么太严重的。

    【讨论】:

    • 这就是我所做的。我实现了 ISerializable 并将字典序列化为数组,然后在构造函数中将数组元素重新添加到字典中。
    【解决方案4】:

    您可能希望使用代理项(实现 ISerializationSurrogate)而不是上述方法。

    http://msdn.microsoft.com/en-us/magazine/cc188950.aspx 为例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-09
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多