2010-03-05 1 views
16

Je dois éviter de sérialiser un membre de classe Evénement car lorsque l'événement est géré par un objet qui n'est pas marqué comme sérialisable, la sérialisation échoue.Comment ignorer le membre de classe d'événement pour la sérialisation binaire?

J'ai essayé d'utiliser l'attribut NonSerialized sur le membre de la classe Event mais il échoue à la compilation. Cette ligne de code:

<NonSerialized()> Public Event PropertyValueChanged() 

produit l'erreur suivante:

Attribute 'NonSerializedAttribute' cannot be applied to 'PropertyValueChanged' because the attribute is not valid on this declaration type.

Public Event PropertyValueChanged() ' compiles but needs the extra handling described below 

Y at-il une autre façon d'éviter sérialisation membres de l'événement?

Ce n'est pas un problème si l'événement n'est pas géré et je peux le contourner en clonant les objets (et en ignorant l'événement) avant de les sérialiser. Je me demandais simplement s'il y avait un meilleur moyen.

Merci.

+0

@Paul - re "échoue toujours"; qu'est-ce que tu veux faire exactement? Je me demande si changer de sérialiseur serait une bonne option ici (ce n'est pas aussi dur que ça en a l'air, et a aussi des avantages secondaires). A vous de bien sûr, mais je peux parler de cette zone pendant * heures * ... –

+0

@Marc: Merci pour le suivi. J'ai simplement besoin d'ignorer les événements lors de la sérialisation d'une classe, car la sérialisation échoue lorsque l'événement est connecté à un objet qui n'est pas sérialisable. L'attribut NonSerialized a du sens, mais ne semble pas fonctionner de la même manière en VB qu'en C# ... J'obtiens une erreur de compilation même lorsque je décore un champ de support à une propriété d'événement publique. Que voulez-vous dire quand vous dites "changer le sérialiseur"? Voulez-vous dire la sérialisation personnalisée ou une autre bibliothèque tierce? –

Répondre

32

En C# vous pouvez le faire comme ci-dessous, donc je espoir cela se traduit de manière identique à VB.

RemarqueCet applique uniquement aux événements comme le terrain (là où vous ne possédez pas votre propre add/remove):

[field: NonSerialized] 
public event EventType EventName; 

Sinon, quelque chose comme:

[NonSerialized] 
EventType backingField; 
public event EventType { 
    add { backingField += value; } 
    remove { backingField -= value; } 
} 
+0

+1 J'aurais dû savoir, qu'il n'y aurait aucun moyen de vous battre pour répondre à cette question. – kemiller2002

+0

Eh bien, j'ai appris quelque chose de nouveau :) Belle solution. – NebuSoft

+0

Malheureusement aucune des deux options ne se traduit par VB ... –

5

Il n'est pas car le compilateur génère un champ de sauvegarde pour l'événement. Pour l'activer, il suffit de préfixer votre attribut avec le champ:

[field: NonSerialized] 
public event EventHandler PropertyValueChanged; 
+0

Cela ne fonctionne pas pour VB.NET pour une raison quelconque. –

0

Comment je l'ai fait dans le passé pour des projets est mise en œuvre de l'interface IXmlSerializable et contrôler mon sérialisation manuellement. Je trouve que cela rend les contrôles basés sur l'interface graphique en série (avec beaucoup d'événements) beaucoup plus faciles.

IXmlSerializable

+0

'IXmlSerializable' ne s'applique pas à la sérialisation binaire.Ce serait 'ISerializable', ce qui est très différent. –

+0

J'ai manqué où il l'a marqué pour Binary. Mon erreur, pour une raison quelconque, j'ai supposé qu'il demandait Xml. – NebuSoft

Questions connexes