Domanda

Sono de / serializzazione di un oggetto in questo 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>));
  }
}

L'oggetto che è nella lista non avere l'attributo Serializable. Durante la serializzazione, nessun errore sono gettati e la lista è non vuoto, ma quando deserializzazione tutte le mie liste sono nulli e non so perché.

Sono marcatura questo come risposta da CQ. Sono stato in grado di produrre una piccola una tantum applicazione di test che non correttamente serializzare / deserializzare con gli oggetti che sto cercando di usare, ma io ancora non riesco a farlo funzionare nel mio codice di produzione, ma ho il sospetto che sia qualcosa di piccolo che ho 'm manca.

È stato utile?

Soluzione

Beh, la lista è sempre vuota per cominciare, stai impostando via myClass.value = new List<...>();? hanno anche salvati i dati serializzati in entrambi i formati binari e XML in modo da poter verificare i dati viene effettivamente salvato?

Solo una nota pure, se si utilizza 2.0+ non devi implementare ISerializable se non è necessario per controllare la serializzazione in assoluto, è possibile modificare il valore di una proprietà pubblica e sarà serializzare su di essa la propria .

Modifica:. Il caso seguente sembra serializzare e deserializzare bene per me, sto postando questo in caso sto fraintendendo la questione nel suo complesso

Ignorando il codice di prova brutta, speriamo che questo aiuta un po '.

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

Hai dimenticato l'uscita ..

  

oggetto serializzato è 754bytes

     

1: Ciao 2: World

Altri suggerimenti

Quando si dice che l'elenco è nullo, vuoi dire che la lista stessa è nullo, o che riempiva con le voci nulli? In quest'ultimo caso, allora questo è un noto problema .Net: vedi la mia domanda sullo stesso problema.

In sostanza, List<T> s vengono inizializzati solo quando sono deserializzate; gli oggetti che contengono vengono deserializzate solo dopo che l'oggetto grafico è stato deserializzato. Un modo per aggirare questo è quello di mettere qualsiasi codice che li richiede in un metodo OnDeserialized, o uno con un [OnDeserializedAttribute]. Vedere MSDN .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top