Почему мой список <T>не сериализуется? - PullRequest
4 голосов
/ 18 августа 2010

Это относится к этому вопросу , но на этот раз я пытаюсь разобраться, как сериализовать словарь.У меня есть класс, который наследует от словаря, который я должен иметь возможность сериализации.

Методы сериализации выглядят так, в основном коллекция значений из словаря добавляется в список, который сериализуется.

[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);
        }
    }
}

Однако, когда вызывается конструктор десериализации, список содержит правильное количество значений, только нулевые значения.

Я подозреваю, что это потому, что узлы еще не были десериализованы (хотя я знаю, что они могут быть сериализованы), но тогда как я могу это исправить?

Ответы [ 4 ]

1 голос
/ 18 августа 2010

Вы пытаетесь сериализовать / десериализовать словарь в формате Xml? Вот почему вы внедряете интерфейс ISerializable и вместо этого используете SerializationInfo?

Хотя сериализатор Xml не поддерживает универсальный тип словаря, DataContractSerializer поддерживает, так что, возможно, вы могли бы попробовать использовать его вместо этого? В противном случае, вот реализация сериализуемого словаря Xml, на который стоит обратить внимание:

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

0 голосов
/ 18 августа 2010

Если я не ошибаюсь, словарь не сериализуем.

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

Это также означает, что простое наследование от него и вызов дочернего Serializable не будет работать.Вам придется использовать другой контейнер - обычно это массив контейнера Key / Value пользовательского класса - ничего особенного.

0 голосов
/ 18 августа 2010

Возможно, вы захотите использовать суррогат (реализующий ISerializationSurrogate) вместо вышеуказанного подхода.

Для примера рассмотрим http://msdn.microsoft.com/en-us/magazine/cc188950.aspx.

0 голосов
/ 18 августа 2010

Вы пытались использовать атрибут [Serializable] в своем классе коллекции?Был ли результат одинаковым?

(почему вы используете ISerializable вместо атрибута?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...