2010-01-12 6 views
2

J'ai une question sur la sérialisation binaire en C#Exclure objet parent sur sérialisation binaire en C#

Je dois être en mesure d'objets clone profond de la classe B (ainsi que toutes ses sous-objets dans le graphique bien sûr). Je voudrais implémenter cela en utilisant la sérialisation binaire. La discussion si c'est la meilleure méthode n'est pas pertinente dans le contexte de cette question.

Dire que j'ai cette structure de classe:

public class A 
{ 
    private B objB; 
} 

[Serializable] 
public class B : ICloneable 
{ 
    private C objC1; 
    private C objC2; 

    public object Clone() 
    { 
     B clone = Helper.Clone<B>(this); 
     return (B)clone; 
    } 
} 

[Serializable] 
public class C 
{ 
    int a; 
    int b; 
} 

La classe d'aide pour le clonage profond avec sérialisation binaire (j'ai reçu ce code de la méthode de quelque part sur le net, ne me souviens pas vraiment où TBH, mais il semble bien)

public static class Helper 
{ 
    public static T Clone<T>(T OriginalObject) 
    { 
     using (Stream objectStream = new MemoryStream()) 
     { 
      IFormatter formatter = new BinaryFormatter(); 
      formatter.Serialize(objectStream, OriginalObject); 
      objectStream.Seek(0, SeekOrigin.Begin); 
      return (T)formatter.Deserialize(objectStream); 
     } 
    } 

} 

donc, à un moment donné dans mon application, je frappe le code suivant:

B clone = (B)objA.objB.Clone(); 

Le problème est que le débogueur gémit à propos du fait que la classe A n'est pas marquée comme sérialisable.

Mais je ne veux pas sérialiser A, je veux sérialisation B et il est subobject C.

Je suppose qu'il essaie de sérialiser l'objet parent trop, parce que tout est interconnecté dans le graphe d'objet. Mais y a-t-il un moyen de l'exclure de la sérialisation à ce stade?

Répondre

2

Ce code maquette rapide fonctionne parfaitement bien, votre problème est ailleurs, peut-être C a une variable de classe A?

public class A 
{ 
    private B bObj = new B(); 

    public A() 
    { 
     B copy = bObj.Clone() as B; 
    } 
} 
[Serializable] 
public class B : ICloneable 
{ 
    private int test = 10; 

    public object Clone() 
    { 
     return Helper.Clone(this); 
    } 

} 

EDIT par commentaire:

s'il vous plaît ajouter ce qui suit à votre event dans B

[field:NonSerialized] 

Cela permettra d'éviter sérialisation de la liste d'appel de l'événement qui, à son tour fait référence A

+0

je double vérifié, il n'y a pas de référence soit de B à A ou de C à A ... La seule chose qui existe, c'est que B contient un champ d'événement public, auquel un gestionnaire d'événements de A est attentif, cela peut-il être la cause? – tjeuten

+0

@tjeuten, oui c'est le cas, l'événement est essayer de sérialiser la liste d'invocation. s'il vous plaît regarder ma réponse éditée –

+0

thx un zillion qui a fait le tour! – tjeuten

1

Si B ne détient aucune référence à A, sérialisation B ne nécessitera pas sérialisable même si A est une référence à B.

À partir de votre exemple de code, B ne détient aucune référence à une sorte ça devrait marcher. Êtes-vous sûr que l'exemple de code que vous avez fourni représente vraiment votre scénario réel?

0

Je ne suis pas sûr, mais que se passe-t-il si vous le marquez comme non sérialisable? Je voudrais tester cela: P

+0

essayé, mais marquer une classe d'un non sérialisable n'est pas autorisé, seuls les champs – tjeuten

0

Il doit y avoir quelque chose d'autre en jeu ici - votre code compile et exécute sans problème (comme il se doit - le type A ne fait pas partie du type B's).

Est-il possible que objB soit réellement une instance de type A?

0

Ok merci pour toutes les réponses, je ne trouve la question ...

classe B contient un champ d'événement public, et un gestionnaire d'événements de classe A est abonnée. Si je me désinscris de l'eventhandler, la sérialisation fonctionne.

Mon erreur pour ne pas afficher toute la situation de code, désolé :(