2009-05-06 4 views
8

Je dois implémenter ISerializable dans une classe dérivée (pour effectuer une sérialisation/désérialisation personnalisée) mais la classe parent est marquée comme [Serializable]. La sérialisation "fonctionne" (je peux sérialiser et désérialiser sans erreurs d'exécution) mais il semble que les données de la classe de base ne soient pas conservées.Si j'implémente ISerializable dans une classe enfant, est-ce que le parent doit aussi le faire?

Le fait que j'implémente GetObjectData dans la classe dérivée annule la sérialisation de la classe de base? Si oui, dois-je implémenter ISerializable dans la classe de base, puis appeler base.GetObjectData (...) dans la classe dérivée pour conserver les données ou y at-il un meilleur moyen que d'écrire info.AddValue (...) 100 fois ?

Editer> Merci Tim. Vous avez confirmé ce que je soupçonnais. Le problème lui-même va un peu plus loin. La classe de base dans mon cas implémente BindingList (T) qui elle-même n'implémente pas ISerializable. En attendant, pour chaque propriété, j'essaierai: Dans le constructeur ISerializable base.Property = info.GetValue (...);

et dans le GetObjectDate info.AddValue ("name", base.Property);

sauf si une meilleure solution est proposée par la merveilleuse communauté SO.

Répondre

6

dois-je mettre en œuvre ISerializable dans la classe de base puis appelez base.GetObjectData (...) dans la classe dérivée

Oui. Dès que vous implémentez ISerializable, toute sérialisation automatique est désactivée.

De même, vous devrez implémenter le constructeur de sérialisation protégé dans la classe de base et dans la classe dérivée.

+1

Très bonne information, mais que faire si ma classe de base elle-même hérite de BindingList (T) - qui n'implémente pas ISerializable (mais est marqué comme [Serializable])? –

+0

Dans le passé, j'ai abordé ce problème en ajoutant du code à mon propre constructeur de sérialisation et à la méthode GetObjectData. –

+0

oui, selon mon montage, je pense que c'est ce que j'ai décidé de faire aussi bien. J'espérais juste une solution plus élégante que celle-ci. –

Questions connexes