2012-04-23 3 views
1

J'ai la classe suivante:objets De-sérialisation avec des classes de membres sérialisés

[Serializable] 
public class A : ISerializable 
{ 

List<B> listOfBs = new List<B>(); 

public A() 
     { 
     // Create a bunch of B's and add them to listOfBs 
     } 

public A(SerializationInfo info, StreamingContext context) 
     { 
     listOfBs = (List<B>)info.GetValue("listOfBs",typeof(List<B>)) 
     listOfBs.Remove(x=>x.s==5) 
     } 

} 

et

[Serializable] 
public class B : ISerializable 
{ 
    public int s; 
    public B(int t) 
     { 
      s=t; 
      } 

    public B(SerializationInfo info, StreamingContext context) 
     { 
     s = info.GetInt32("s"); 
     } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
     info.AddValue("s",s); 
     } 
} 

Le problème du line listOfBs.Remove(x=>x.s==5) jette une exception parce que le constructeur de-sérialisation de B ne fonctionne pas avant A est fait. Lorsque je parcours le code, listOfBs de A est juste une entrée d'objets NULL correspondant à combien de B sont réellement dans listOfBs

Comment peut-on résoudre ce problème de séquence de désérialisation?

Répondre

2

Mettre en œuvre IDeserializationCallback. IDeserializationCallback.OnDeserialization est appelée lorsque la désérialisation est terminée pour l'ensemble du graphe d'objets. Je crois que la classe A serait le meilleur endroit pour l'implémenter, et vous mettriez votre code de problème dans A.OnDeserialization comme suit.

[Serializable] 
public class A : ISerializable, IDeserializationCallback 
{ 
    List<B> listOfBs = new List<B>(); 
    public A() 
    { 
    // Create a bunch of B's and add them to listOfBs 
    } 

    public void OnDeserialization() 
    { 
    listOfBs.Remove(x=>x.s==5) 
    } 
} 
+0

Merci! Travaillé comme un charme. Je regrette d'avoir un seul upvote à donner – Matt

Questions connexes