Pregunta

Estoy de / serialización de un objeto de este modo:

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>));
  }
}

El objeto que está en la lista hace tiene el atributo Serializable. Cuando seria, no hay errores se tiran y la lista es no vacío, pero al deserializar todos mis listas son nulos y no estoy seguro de por qué.

Estoy marcar esto como respondida por CQ. Yo era capaz de producir una pequeña aplicación de prueba de que no serializar correctamente / deserializar objetos con los que estoy tratando de utilizar pero todavía parece que no puede conseguir que funcione en mi código de producción, pero sospecho que es algo pequeño que yo 'm falta.

¿Fue útil?

Solución

Bueno, la lista es siempre vacío, para empezar, que está configurando vía myClass.value = new List<...>();? También tiene que guardó los datos serializados en ambos formatos binarios y XML para que pueda verificar los datos que realmente se está salvado?

Sólo una nota, así, si está utilizando 2.0+ usted no tiene que poner en práctica ISerializable si no es necesario controlar la serialización absoluta, puede cambiar el valor de una propiedad pública y va a serializar en su propio .

Editar:. El siguiente caso parece serializar y deserializar bien para mí, estoy publicando esto en caso estoy entendiendo mal la cuestión en su conjunto

Haciendo caso omiso de las normas de prueba desagradable, es de esperar que esto ayude un poco.

    [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]);

Ha olvidado la salida ..

  

objeto serializado es 754bytes

     

1: Hola 2: World

Otros consejos

Cuando dice que su lista es nula, ¿Quiere decir que la lista en sí es nulo, o que se llena de entradas nulas? Si esto último, entonces este es un problema conocido .Net: ver mi pregunta en el mismo problema.

Básicamente, List<T> s solamente se inicializan cuando se deserializan; los objetos que en ellos sólo se deserializan después de que el gráfico de objetos ha sido deserializado. Una forma de evitar esto es poner cualquier código que les obliga en un método OnDeserialized, o uno con un [OnDeserializedAttribute]. Ver MSDN .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top