Question

Je suis de / sérialisation un objet comme ceci:

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'objet qui se trouve dans la liste Finalité ont l'attribut Serializable. Lors de la sérialisation, aucune erreur sont jetés et la liste est jamais vide, mais quand désérialisation toutes mes listes sont nulles et je ne sais pas pourquoi.

Je marquer cela comme une réponse par CQ. Je suis en mesure de produire un petit hors application de test qui ne linéariser / désérialiser avec les objets que je suis en train d'utiliser, mais je ne peux toujours pas sembler correctement pour le faire fonctionner dans mon code de production, mais je soupçonne que c'est quelque chose de petit que je « m manquante.

Était-ce utile?

La solution

Eh bien, la liste est toujours vide pour commencer, via vous définissez myClass.value = new List<...>();? ont également enregistré les données que vous sérialisés dans les deux formats binaires et XML afin que vous puissiez vérifier les données est réellement sauvé?

Juste une note aussi bien, si vous utilisez 2.0+ vous n'avez pas à mettre en œuvre ISerializable si vous n'avez pas besoin de contrôler la sérialisation absolue, vous pouvez changer la valeur à une propriété publique et sérialisera sur son propre .

Edit:. Le cas suivant semble sérialisation et la désérialisation bien pour moi, je suis annonce ce Incase Je malentendu la question dans son ensemble

Ignorant le code de test méchant, nous espérons que cela aide un peu.

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

Vous avez oublié la sortie ..

  

objet sérialisé est 754bytes

     

1: Bonjour 2: Monde

Autres conseils

Quand vous dites que votre liste est nulle, voulez-vous dire que la liste elle-même est nulle, ou qu'il rempli avec des entrées nulles? Dans ce dernier cas, cela est un problème de .Net connu: voir ma question sur le même problème.

En fait, s ne sont List<T> initialisés quand ils sont désérialisé; les objets qu'ils contiennent ne sont désérialisé après le graphe d'objet a été désérialisé. Une façon de contourner cela est de tout le code qui les oblige à une méthode de OnDeserialized, ou avec un [OnDeserializedAttribute]. Voir MSDN .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top