2010-12-02 2 views
7

J'ai une classe de base abstraite personnalisée avec des sous-classes que j'ai rendues sérialisables/désérialisables avec ISerializable. Quand je fais la sérialisation/désérialisation des instances uniques des sous-classes de cette classe, tout fonctionne bien. Cependant, quand je fais un tableau d'entre eux, je finis toujours avec un tableau de null sur la désérialisation. La sérialisation est effectuée avec BinaryFormatter.La désérialisation d'un tableau donne toujours un tableau de zéro

Les éléments sont contenus dans un:

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

Sur sérialisation cela se fait dans GetObjectData sur le paramètre SerializationInfo:

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

Et désérialisation cela se fait dans le constructeur de sérialisation également sur la Paramètre SerializationInfo:

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

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

Des erialization me donne toujours un tableau de valeurs nulles et comme je l'ai mentionné plus tôt, un seul élément sérialise et deseriaizes très bien avec ce code:

sérialisation (méthode GetObjectData):

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

Désérialisation (sérialisation Constructor):

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

Est-ce un problème courant? Il semble que personne ne s'y soit pris au moins. J'espère qu'il y a une solution :) et si je dois vous fournir plus d'informations/code, dites-le moi.

Merci!

+0

Salut, quelle est la variable d'information? Quel est le format de sérialisation? Xml ou binaire? –

+1

c'est le SerializationInfo que j'utilise dans le GetObjectData et le constructeur Serialization, désolé aurait dû le mentionner. – vesz

+0

http://stackoverflow.com/questions/126155/c-array-xml-serialization Une aide? – Polity

Répondre

9

La matrice se désérialise en premier. Alors toute la désérialisation intérieure est faite. Ainsi, lorsque vous essayez d'accéder à des éléments, ils sont null.

Et l'idée d'utiliser [OnDeserialized] Attribut sur une méthode, qui construit toutes les autres propriétés. Et voici un exemple:

[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

Je vais essayer de regarder dans un peu plus et fournir un peu plus de code Dans ma question, je suis en train de faire une sérialisation sur une classe qui contient ce tableau d'objets sérialisables.Une alternative est de sérialiser l'ensemble du tableau avec des noms différents dans SerializationInfo. "trade1" et ainsi de suite – vesz

+0

Réponse mise à jour, maintenant cela devrait aider –

+0

Test maintenant, donnez-moi une seconde. Vous êtes trop rapide :) Je n'ai même pas fini mon nouveau projet de test: D – vesz

Questions connexes