Вопрос

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

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.При сериализации ошибок не возникает, и список никогда пусто, но при десериализации все мои списки имеют значение null, и я не знаю почему.

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

Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top