Frage

Ich bin de / Serialisierung ein Objekt wie folgt:

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

Das Objekt, das in der Liste hat haben das Attribut Serializable. Wenn die Serialisierung, werden keine Fehler ausgelöst und die Liste ist nie leer, aber wenn alle meine Listen Deserialisieren sind null und ich bin mir nicht sicher, warum.

ich diese Kennzeichnung wie CQ beantwortet. Ich konnte einen kleinen off-Test App produzieren, die richtig / deserialisieren nicht serialisiert werden mit den Objekten Ich versuche zu verwenden, aber ich kann immer noch nicht scheinen, es in meiner Produktion Code zu arbeiten, aber ich vermute, es ist etwas klein, dass ich ist fehlt.

War es hilfreich?

Lösung

Nun, die Liste ist immer leer zu beginnen, werden Sie es über myClass.value = new List<...>(); Einstellung? Auch Sie haben die serialisierten Daten in beide binären und XML-Format gespeichert, so dass Sie Daten überprüfen können, wird tatsächlich gespeichert werden?

Wie auch eine Notiz, wenn Sie mit 2.0+ Sie haben nicht ISerializable zu implementieren, wenn Sie nicht über die absolute Serialisierung steuern müssen, Sie Wert auf ein öffentliches Eigentum ändern, und es wird auf seine eigene Serialisierung .

Edit:. Der folgende Fall scheint für mich in Ordnung zu serialisieren und deserialisieren, ich bin Entsendung diese einhüllen ich die Frage als Ganzes bin Missverständnis

Sie den fiesen Testcode Ignorieren, hoffentlich hilft ein wenig.

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

Sie haben die Ausgabe ..

  

serialisierte Objekt ist 754bytes

     

1: Hallo 2: World

Andere Tipps

Wenn Sie sagen, dass Ihre Liste null ist, meinen Sie, dass die Liste selbst null ist, oder dass es mit null Einträgen gefüllt? Wenn letzteres, dann ist dies ein bekanntes Problem .Net: siehe meine Frage auf dem gleichen Problem.

Grundsätzlich List<T>s sind nur initialisiert, wenn sie deserialisiert werden; die Objekte, die sie enthalten, werden deserialisiert erst nach dem Objektgraph hat deserialisiert worden. Ein Weg, um dies ist jeden Code zu setzen, die sie in einem OnDeserialized Verfahren erfordert, oder einen mit einer [OnDeserializedAttribute]. Siehe MSDN .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top