2010-10-20 14 views
0

Je ne m'attendais pas à rencontrer cette erreur. J'imagine que je fais quelque chose de mal ailleurs.Sérialiser ma classe échoue à cause d'un gestionnaire d'événement

J'ai une application MVVM. Mon modèle peut se sérialiser avec un BinaryFormatter. Cela fonctionnait bien.

Aujourd'hui, j'ai ajouté un gestionnaire d'événement à mon modèle, et le modèle de vue qui contient le modèle est abonné à cet événement.

Maintenant, quand j'essaie de sérialiser le modèle, j'obtiens une erreur parce que mon viewmodel n'est pas sérialisable (par conception).

Je suis sûr que c'est à l'abonnement à l'événement, parce que j'ai supprimé l'abonnement (et seulement cela) et la sérialisation fonctionne à nouveau.

Je ne peux pas appliquer l'attribut [NonSerialized] au gestionnaire car ce n'est pas un champ.

Y at-il un moyen de contourner ce problème?

+0

Pour info, ceci est juste l'un des nombreux pièges avec BinaryFormatter. IMO ce n'est pas le sérialiseur idéal. Je vous conseille de regarder XmlSerializer, DataContractSerializer ou protobuf-net –

Répondre

2

vous pouvez le faire:

[field:NonSerialized] 
public event EventHandler MyEvent; 
1

Vous pouvez faire de cet événement un champ comme celui-ci:

[NonSerialized] 
    private EventHandler _eventHandler; 

    public event EventHandler MyEvent 
    { 
     add { _eventHandler += value; } 
     remove { _eventHandler -= value; } 
    } 
0

Je ne sais pas comment cela est utile, mais ...

... ce que Pieter a mentionné, vous pouvez également avoir plusieurs gestionnaires de délégués enveloppés dans le même événement, de sorte que vous puissiez (théoriquement) rendre votre événement, en effet, à la fois en série izable et non sérialisable en faisant quelque chose comme ceci:

[NonSerialized] 
private EventHandler _nonSerializableeventHandler; 
private EventHandler _eventHandler; 

public event EventHandler MyEvent 
{ 
    add 
    { 
     if (value.Method.DeclaringType.IsSerializable) 
      _eventHandler += value; 
     else 
      _nonSerializableeventHandler += value; 
    } 
    remove 
    { 
     { 
      if (value.Method.DeclaringType.IsSerializable) 
       _eventHandler -= value; 
      else 
       _nonSerializableeventHandler -= value; 
     } 
    } 
}