2010-12-02 13 views
7

Tengo una clase base abstracta personalizada con subclases que he hecho serializable/deseriablizable con ISerializable. Cuando hago serialización/deserialización de instancias individuales de las subclases de esta clase, todo funciona bien. Sin embargo, cuando hago una serie de ellos siempre termino con una matriz de nulos en la deserialización. La serialización se realiza con BinaryFormatter.Deserialización de una matriz siempre da una matriz de nulos

Los elementos están contenidos dentro de una:

public ObservableCollection<Trade> Trades { get; private set; } 

en la serialización esto se hace en GetObjectData en el parámetro SerializationInfo:

Trade[] trades = (Trade[])Trades.ToArray<Trade>(); 
      info.AddValue("trades", trades); 

Y en deserialización esto se hace en el constructor de serialización también en la Parámetro SerializationInfo:

Trade[] trades = (Trade[])info.GetValue("trades", typeof(Trade[])); 

      foreach (Trade t in trades) 
      { 
       Trades.Add(t); 
      } 

Des erialization siempre me da una serie de valores nulos y como he mencionado antes, un solo elemento serializa y deseriaizes muy bien con este código:

serialización (método GetObjectData):

info.AddValue("trade", Trades.First<Trade>()); 

Deserialización (serialización Constructor):

Trade t = (Trade)info.GetValue("trade", typeof(Trade)); 
      Trades.Add(t); 

¿Este es un problema común? Parece que no hay ninguna otra persona corriendo al menos. Afortunadamente hay una solución :) y si necesito proporcionarle más información/código solo dígame.

Gracias!

+0

Hola, ¿qué es la variable de información? ¿Cuál es el formato de serialización? Xml o binario? –

+1

es la SerializationInfo que uso en GetObjectData y Serialization-constructor, lo siento, debería haberlo mencionado. – vesz

+0

http://stackoverflow.com/questions/126155/c-array-xml-serialization ¿Alguna ayuda? – Polity

Respuesta

9

Array deserializes first. Entonces toda la deserialización interna está hecha. Entonces, cuando intenta acceder a los artículos, son nulos.

Y la idea de usar [OnDeserialized] Atributo en algún método, que construye todas las demás propiedades. Y aquí está el ejemplo:

[Serializable] 
public class TestClass : ISerializable 
{ 
    private Trade[] _innerList; 
    public ObservableCollection<Trade> List { get; set; } 

    public TestClass() 
    { } 

    [OnDeserialized] 
    private void SetValuesOnDeserialized(StreamingContext context) 
    { 
     this.List = new ObservableCollection<Trade>(_innerList); 
     this._innerList = null; 
    } 

    protected TestClass(SerializationInfo info, StreamingContext context) 
    { 
     var value = info.GetValue("inner", typeof(Trade[])); 
     this._innerList = (Trade[])value; 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("inner", this.List.ToArray()); 
    } 
} 
+0

Voy a tratar de investigar un poco más y proporcionar un poco más de código en mi pregunta. En realidad estoy haciendo serialización en una clase que contiene esta matriz de objetos serializables. Una alternativa es serializar toda la matriz con diferentes nombres en SerializationInfo. "trade1" y así sucesivamente. – vesz

+0

Respuesta actualizada, ahora esto debería ayudar) –

+0

Poniéndolo a prueba ahora, dame un segundo. Eres demasiado rápido :) Ni siquiera pude terminar mi nuevo proyecto de prueba: D – vesz

Cuestiones relacionadas