десериализация общего списка возвращает ноль
-
21-08-2019 - |
Вопрос
Я десериализую объект следующим образом:
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.