десериализация общего списка возвращает ноль - PullRequest
5 голосов
/ 05 февраля 2009

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

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. Мне удалось создать небольшое одно тестовое приложение, которое правильно сериализовало / десериализовало объекты, которые я пытаюсь использовать, но я все еще не могу заставить его работать в моем производственном коде, но я подозреваю, что это что-то маленькое, что я пропал.

Ответы [ 2 ]

5 голосов
/ 10 августа 2010

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

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

3 голосов
/ 05 февраля 2009

Ну, список всегда пуст для начала, вы устанавливаете его через 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: Мир

...