2010-04-14 6 views
27

Je pense que l'ajout de cet attribut à une interface serait utile assurez-vous de ne pas créer de classes qui utilisent l'interface et oubliez de les rendre sérialisables.Pourquoi les interfaces ne sont pas [Serializable]?

Cela pourrait être une question très fondamentale, mais je voulais demander aux experts.

+0

Yous devriez vérifier cette réponse si vous voulez que la façon dont http: // stackoverflow.com/questions/1333864/xml-serialization-of-interface-propriété – juharr

Répondre

65

Les interfaces définissent un contrat et n'ont aucun état propre.

La sérialisation consiste à enregistrer et charger l'état dans et hors d'un modèle d'objet.

Pas grand-chose à sérialiser quelque chose qui ne détient aucun état.


Pour répondre à la question pratique de forcer une mise en œuvre d'une interface pour être Serializable - c'est pourquoi l'interface ISerializable existe.

Dans .NET, vous pouvez déclarer une interface qui devrait mettre en œuvre d'autres interfaces:

interface MustBeSerializable : ISerializable {} 

Voir quelques informations here.

+0

Explication génial :-) – Raja

+0

Grande explication. –

+6

Défenseur du diable: les interfaces impliquent * comment * les objets fonctionnent avec leur état. Les interfaces n'ont pas d'état mais elles seront utilisées pour définir des objets qui font et se contractent avec la façon dont l'état peut être accédé. – Dinah

4

Si vous voulez forcer les classes qui mettent en œuvre votre interface personnalisée IMyInterface sérialisable vous pouvez le définir a:

interface IMyInterface : ISerializable 
{ 
    // Custom interface definition 
} 

Cette plus indique clairement que la mise en œuvre de la classe devrait soutenir la sérialisation. Cela ne supprime pas la nécessité de marquer la classe avec l'attribut [Serializable]. IlRC, vous pouvez également créer une règle personnalisée FxCop qui vérifie que les classes qui héritent de IMyInterface sont marquées avec l'attribut [Serializable] respectif et de cette façon la suppression du besoin pour les classes implémentent la sérialisation personnalisée.

2

Il existe de bonnes raisons, quoique ésotériques, derrière ce qu'est une interface et ce qui ne l'empêche pas d'être possible. Cela dit cependant: je suis d'accord avec vous. Il y a beaucoup de choses qui seraient utiles si nous pouvions les intégrer dans des interfaces. [Serializable] et la statique viennent à l'esprit.

Bien qu'ils ne s'inscrivent pas dans la philosophie de ce qu'est une interface, ils semblent intégrer cette zone grise vacante dans la POO à héritage unique. Il y a bien sûr des contournements, mais ils se sentent très contraints par rapport à l'intention originale.

2

Eh bien, il y a une raison pour que les nouvelles classes ne sont pas marqués comme sérialisable par défaut: En ajoutant l'attribut Serializable, vous reconnaissez que vous avez fait en sorte que la sérialisation dans votre classe fonctionne, en choisissant les types de données appropriés pour votre instance champs et en ajoutant une logique de sérialisation, si nécessaire. Par conséquent, si vous avez "oublié" d'ajouter l'attribut Serializable à votre classe, vous avez probablement oublié de vérifier si la sérialisation fonctionne réellement dans votre classe. Certes, dans la plupart des cas, cela fonctionnera "hors de la boîte", donc l'ajout de l'attribut est tout ce qui reste, mais vous êtes censé vérifier et reconnaître explicitement ce fait (en ajoutant manuellement l'attribut).

Questions connexes