2010-07-21 5 views
1

J'ai récemment implémenté une fonction Copier & Coller dans une application sur laquelle je travaille. Cela fonctionne à peu près comme prévu.
Je crée un nouvel élément dans mon interface utilisateur et je peux le copier et le coller aussi souvent que je le souhaite sans aucun problème.
Mais lorsque je copie & coller un élément qui a été produit par une copie précédente & pâte action, j'obtiens un SerializationException. Il se plaint qu'un certain type ne soit pas marqué comme sérialisable.Mise au point des problèmes de sérialisation en C#

C'est ici que commence la confusion. La première copie & action d'action interagit avec le même type d'objets que le second. Mais la seconde résulte de l'exception.

Pour être un peu plus détaillé, j'ai une classe Slide, c'est la classe qui est la cible de la copie & opération de collage. Donc, je place une instance de cet objet dans le presse-papiers et je le colle à nouveau dans le même conteneur. Cela fonctionne comme prévu. Maintenant, je copie cet objet inséré et il essaie de le coller. C'est quand l'exception est levée. L'exception se plaint d'une classe SlideEditorUi. SlideEditorUi est un UserControl qui interagit avec une classe appelée SlideEditor. Qui à son tour interagit avec une instance Slide. Mais aucune instance Slide n'a de référence à l'une des classes mentionnées ci-dessus.
Je me demande donc vraiment pourquoi la procédure de sérialisation prend en compte cette classe. Et pourquoi ne fait-il cela que lorsque je copie une copie?

Répondre

2

Habituellement, le problème dans ce scénario est un événement contenant une référence à un autre objet. BinaryFormatter suit le champ sous-jacent à l'objet et boom.

Si vous pouvez trouver l'événement incriminé, vous pouvez utiliser (pour un événement « champ comme »):

[field:NonSerialized] 
public event SomeEventHandler EventName; 

ou pour une mise en œuvre explicite, ajoutez [NonSerialized] au champ de support.

En variante; utiliser autre chose que BinaryFormatter; p Json ou xml font des formats simples que vous pouvez utiliser via une chaîne, ou pour des objets plus grands/plus complexes, il existe d'autres formats de sérialisation binaires.

+0

C'était en effet un événement. Je ne savais pas que ceux-ci sont également sérialisés. Merci beaucoup. –

+1

@gencha * stricto sensu * ce n'est pas l'événement qui est sérialisé, mais plutôt le contenu du champ de sauvegarde. Un événement est * un peu * comme une propriété: il définit les méthodes d'accès. 'BinarySerializer' est un sérialiseur de niveau champ, donc contourne ceci. –

+0

Ah, merci pour la clarification. –

0

L'erreur concerne une partie de votre objet de données qui ne contient pas le SerializableAttribute. Pourquoi ne lance-t-on pas la sérialisation, mais ne le fait pas en se re-réalisant, je ne sais pas. Il serait peut-être bon de voir le POCO que vous essayez de sérialiser. Ce que je soupçonne, c'est que vous manquez en effet cet attribut sur une propriété ou un champ.

Notez ce qui suit (à partir du lien de la documentation ci-dessus), esp. le mot « graphique », ce qui signifie que, toutes les classes, des parents, des agrégats et des références doivent être sérialisable pour l'erreur de ne pas jeter:

Appliquer l'attribut SerializableAttribute à un type pour indiquer que cas de cette type peut être sérialisé. Le langage commun runtime lève SerializationException si aucun type dans le graphique des objets en cours de sérialisation n'a pas l'attribut SerializableAttribute appliqué.