J'ai une exception très étrange dans mon application C#: lors d'une tentative de désérialisation d'une classe contenant un List<IListMember>
générique (où les entrées de la liste sont spécifiées par une interface), une exception est générée "le type ... IListMember n'est pas marqué avec l'attribut sérialisable" (le phrasé peut être légèrement différent, mon VisualStudio n'est pas en anglais).Interface "non marqué avec l'attribut sérialisable" exception
Maintenant, les interfaces ne peuvent pas être sérialisables; la classe réellement contenue dans la liste, implémentant IListMember, est[Serializable]
; et oui, j'ai vérifié que IListMember
est en fait défini comme une interface et non accidentellement comme une classe!
J'ai essayé de reproduire l'exception dans un projet de test séparé contenant uniquement la classe contenant la liste et les membres, mais il sérialise et désérialise joyeusement:/
Est-ce que quelqu'un a des bonnes idées sur ce qu'il pourrait être ?
Edit:
Nous utilisons un BinarySerializer
; et je le répète, une fois extrait dans un projet de test, la classe se sérialise avec bonheur. Donc je n'ai pas besoin d'une solution de contournement pour sérialiser une classe contenant un List<IThing>
, car en général cela fonctionne très bien (tant que les classes réelles implémentant IThing
sont sérialisables); ce que je cherche est des raisons pour lesquelles il pourrait pas travail ce moment ...
Je vais maintenant mettre dans une solution de contournement (sérialisation chaque membre de la liste individuellement, ainsi que le nombre d'entrées, et recréant l'List
par main), mais aimerait vraiment savoir ce que cela pourrait être pour référence future.
Quel sérialiseur utilisez-vous? 'BinaryFormatter'? 'XmlSerializer'? 'DataContractSerializer'? "Sérialiseur organique maison de Bob"? Également - y a-t-il des 'événements 'impliqués? –
Voir ma modification; et oui, il y a des événements impliqués quelque part le long de la ligne menant à l'appel de binaryFormatter.Deserialize; voyez-vous une connexion? –
L'interface est utilisée pour déterminer si la classe indique qu'elle peut être sérialisée, si vous avez une liste de références basées sur une interface, où l'interface n'est pas marquée comme sérialisable, peut-être que le code de sérialisation essaie de vous dire objets ici qu'il ne peut pas traiter? Même si votre graphique d'objet actuel est A-OK. –