2008-10-08 8 views
41

Si quelque chose hérite d'une classe sérialisable, la classe enfant est-elle toujours sérialisable?Héritage sérialisable

+0

De plus, cette question est ambiguë –

Répondre

75

Cela dépend de ce que vous voulez dire être sérialisable. Si vous voulez dire le marqueur CLI (c'est-à-dire l'attribut [Serializable]), alors c'est et non hérité (preuve ci-dessous). Vous devez marquer explicitement chaque classe dérivée comme [Serializable]. Si, cependant, vous voulez dire l'interface, alors oui: les implémentations d'interface sont héritées, mais vous devez être prudent - par exemple en utilisant une méthode virtual afin que les classes dérivées puissent contribuer leurs données à la sérialisation.

using System; 

class Program 
{ 
    static void Main() 
    { 
     Console.WriteLine(typeof(Foo).IsSerializable); // shows True 
     Console.WriteLine(typeof(Bar).IsSerializable); // shows False 
    } 
} 

[Serializable] 
class Foo {} 

class Bar : Foo {} 
+0

Les attributs, par nature, ne sont pas hérités. En outre, une classe ne peut pas être considérée comme héritant d'un attribut. Ergo, les attributs n'ont rien à voir avec la question du PO. – NotMe

+17

Désolé, mais vous avez tort. Les attributs * do * se rapportent à la question; l'attribut [Serializable] est l'un de ceux que le compilateur gère différemment: il l'utilise pour définir l'indicateur "serializable" sur la classe CLI (si vous vérifiez l'IL, il jette réellement l'attribut à ce stade). –

+4

De même, je n'ai jamais rien dit de la classe héritant d'un attribut - bien qu'en réalité, puisque les attributs * sont * classes, et que les attributs puissent hériter les uns des autres, une classe d'attribut hérite beaucoup d'un attribut ... –