deserializing um genérico lista retorna NULL
-
21-08-2019 - |
Pergunta
Estou DE / serialização de um objeto assim:
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>));
}
}
O objeto que está na lista faz ter o atributo Serializable. Quando a serialização, sem erros são jogados ea lista é não esvaziar, mas quando deserializing todas as minhas listas são nulos e eu não sei por que.
Estou marcando este como respondidas por CQ. I foi capaz de produzir um pequeno off aplicativo de teste que faz corretamente serialize / deserialize com os objetos que eu estou tentando usar, mas eu ainda não consigo fazê-lo funcionar no meu código de produção, mas eu suspeito que é uma coisa pequena que eu 'm faltando.
Solução
Bem, a lista está sempre vazio, para começar, você está definindo-o via myClass.value = new List<...>();
? Também tem você salvou os dados serializados em ambos os formatos binários e XML para que possa verificar os dados que realmente está sendo salvo?
Apenas uma nota, bem como, se você estiver usando 2.0+ você não tem que implementar ISerializable se você não precisa controlar a serialização absoluta, você pode alterar o valor de uma propriedade pública e que irá seriar, por si própria .
Edit:. O caso a seguir parece serialize e deserialize bem para mim, eu estou postando isso meter eu sou mal-entendido a questão como um todo
Ignorando o código de teste desagradável, espero que isso ajude um pouco.
[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]);
Esqueceu a saída ..
objeto serializado é 754bytes
1: Olá 2: World
Outras dicas
Quando você diz que a sua lista é nulo, você quer dizer que a lista em si é nulo, ou que preenchidos com entradas nulas? Neste último caso, então este é um problema .Net conhecido: veja minha pergunta no mesmo problema.
Basicamente, List<T>
s só são inicializados quando são desserializado; os objectos que eles contêm apenas são desserializadas após o gráfico do objeto foi desserializadas. Uma maneira de contornar isso é colocar qualquer código que lhes exige em um método OnDeserialized
, ou um com um [OnDeserializedAttribute]
. Consulte MSDN .