десериализация универсального списка возвращает null

Я де/сериализую объект следующим образом:

public class myClass : ISerializable
{
  public List<OType> value;

  public myClass(SerializationInfo info, StreamingContext context)
  {
    this.value = (List<OType>)info.GetValue("value", typeof(List<OType>));
  }

  void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
  {
    info.AddValue("value", value, typeof(List<OType>));
  }
}

Объект в списке имеет атрибут Serializable. При сериализации ошибок не возникает, и список никогда не бывает пустым, но при десериализации все мои списки пустые, и я не знаю, почему.

Я отмечаю это как ответ CQ. Мне удалось создать небольшое тестовое приложение, которое правильно сериализует/десериализует объекты, которые я пытаюсь использовать, но я все еще не могу заставить его работать в моем производственном коде, но я подозреваю, что это что-то маленькое, что я пропал без вести.


person Steven Evers    schedule 05.02.2009    source источник
comment
Возможно, OType не сериализуем?   -  person hova    schedule 05.02.2009
comment
У меня похожая проблема: stackoverflow.com/questions/1097797   -  person Agnel Kurian    schedule 09.07.2009


Ответы (2)


Ну, список всегда пуст для начала, вы устанавливаете его через myClass.value = new List<...>();? Также вы сохранили сериализованные данные как в двоичном формате, так и в формате xml, чтобы вы могли убедиться, что данные действительно сохраняются?

Просто примечание: если вы используете 2.0+, вам не нужно реализовывать ISerializable, если вам не нужно контролировать абсолютную сериализацию, вы можете изменить значение на общедоступное свойство, и оно будет сериализоваться самостоятельно.

Изменить: следующий случай, кажется, сериализуется и десериализуется нормально для меня, я публикую это, если я неправильно понимаю вопрос в целом.

Игнорируя неприятный тестовый код, надеюсь, это немного поможет.

    [Serializable]
    public class OType
    {
        public int SomeIdentifier { get; set; }
        public string SomeData { get; set; }

        public override string ToString()
        {
            return string.Format("{0}: {1}", SomeIdentifier, SomeData);
        }
    }

    [Serializable]
    public class MyClass : ISerializable
    {
        public List<OType> Value;

        public MyClass() {  }

        public MyClass(SerializationInfo info, StreamingContext context)
        {
            this.Value = (List<OType>)info.GetValue("value", typeof(List<OType>));
        }

        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("value", Value, typeof(List<OType>));
        }
    }

...

        var x = new MyClass();

        x.Value = new OType[] { new OType { SomeIdentifier = 1, SomeData = "Hello" }, new OType { SomeIdentifier = 2, SomeData = "World" } }.ToList();

        var xSerialized = serialize(x);

        Console.WriteLine("Serialized object is {0}bytes", xSerialized.Length);

        var xDeserialized = deserialize<MyClass>(xSerialized);

        Console.WriteLine("{0} {1}", xDeserialized.Value[0], xDeserialized.Value[1]);

Вывод забыл..

Сериализованный объект 754 байта

1: Привет 2: Мир

person Quintin Robinson    schedule 05.02.2009
comment
Мне нужно реализовать iserializable, потому что я сериализую некоторые растровые изображения (не показаны), и вы не можете напрямую сериализовать растровое изображение простым способом, не получая ошибки gdi. Как я уже сказал, список никогда не бывает пустым. Также: я не сериализовал данные в формате xml. Рассмотрю это. - person Steven Evers; 05.02.2009

Когда вы говорите, что ваш список нулевой, вы имеете в виду, что сам список нулевой или что он заполнен пустыми записями? Если последнее, то это известная проблема .Net: см. -filled-with-nul">мой вопрос по той же проблеме.

По сути, List<T> инициализируются только при десериализации; объекты, которые они содержат, десериализуются только после десериализации графа объектов. Один из способов обойти это — поместить любой код, который требует их, в метод OnDeserialized или в метод [OnDeserializedAttribute]. См. MSDN.

person Joel in Gö    schedule 10.08.2010