C# 为什么我的列表是<;T>;没有被序列化?

C# 为什么我的列表是<;T>;没有被序列化?,c#,list,serialization,tree,C#,List,Serialization,Tree,这涉及到,但这一次我正在尝试解决如何序列化字典。我有一个从字典继承的类,我需要能够序列化它 序列化方法如下所示,基本上是将字典中的值集合添加到列表中,然后进行序列化 [Serializable] public class Collection: SortedDictionary<Key, Node>, ISerializable { public void GetObjectData(SerializationInfo info, StreamingContext con

这涉及到,但这一次我正在尝试解决如何序列化字典。我有一个从字典继承的类,我需要能够序列化它

序列化方法如下所示,基本上是将字典中的值集合添加到列表中,然后进行序列化

[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);
        }
    }
}
[可序列化]
公共类集合:SortedDictionary,ISerializable
{  
public void GetObjectData(SerializationInfo信息、StreamingContext上下文)
{
列表节点=新列表();
//这里提到的“值”是SortedDictionary的值集合
Nodes.AddRange(值);
info.AddValue(“Nodes”,Nodes,Nodes.GetType());
}
公共集合(SerializationInfo、StreamingContext上下文)
:base(新键.Comparer())
{
List SerValues=(List)info.GetValue(“节点”,typeof(List));
foreach(节点在SerValues中的ThisNode)
{
//此add方法已扩展,因此它会自动生成密钥。
添加(此节点);
}
}
}
然而,当我调用反序列化构造函数时,列表包含了正确数量的值,只有空值


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

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


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

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

是的:


这也意味着仅仅从它继承并调用子序列化将不起作用。您将不得不使用不同的容器—通常是自定义类键/值容器的数组—没有什么太严重的问题。

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


请看一个示例。

您是否正在尝试对字典进行Xml序列化/反序列化?这就是为什么要实现ISerializable接口并使用SerializationInfo的原因吗

虽然Xml序列化程序不支持泛型字典类型,但DataContractSerializer支持泛型字典类型。您可以尝试改用它吗?如果做不到这一点,下面是一个Xml可序列化字典的实现,可能值得一看:


没有理由不工作。您是否尝试过单独添加节点以查看其是否有效?我可以,但是如果将节点添加到SerializationInfo中,它们都需要密钥,那么我将如何检索这些节点。如果没有问题的话,可能还有其他一些我没有提到的影响序列化的因素。我也使用了[Serializable]属性(我已经将其添加到帖子中)。我需要ISerializable,这样我就可以更改字典的序列化方式,因为它们不能正常序列化。@fneep:你说字典不能正常序列化是什么意思?真奇怪,互联网让我相信字典不能序列化。试试谷歌搜索“c#SerializeDictionary”。即便如此,为什么这不起作用?我就是这么做的。我实现了ISerializable,它将字典序列化为数组,然后在构造函数中将数组元素重新添加到字典中。