Question

Il semble que je puisse sérialiser des classes qui ne possèdent pas cette interface, je ne suis donc pas sûr de son objectif.

Était-ce utile?

La solution

ISerializable est utilisé pour fournir une sérialisation binaire personnalisée, généralement pour BinaryFormatter (et peut-être à des fins de communication à distance). Sans cela, il utilise les champs, qui peuvent être:

  • inefficace; s'il existe des champs qui ne sont utilisés que pour l'efficacité au moment de l'exécution, mais peuvent être supprimés pour la sérialisation (par exemple, un dictionnaire peut avoir un aspect différent lorsqu'il est sérialisé)
  • inefficace; comme même pour les champs nécessaires, il doit inclure beaucoup de métadonnées supplémentaires
  • invalide; s'il existe des champs pour lesquels ne peut pas être sérialisés (tels que les délégués d'événement, bien qu'ils puissent être marqués [non sérialisés] )
  • fragile; votre sérialisation est maintenant liée aux noms de champs - mais les champs sont censés être un détail d'implémentation; voir aussi Obfuscation, sérialisation et propriétés implémentées automatiquement

En implémentant ISerializable , vous pouvez fournir votre propre mécanisme de sérialisation binaire. Notez que l'équivalent xml de ceci est IXmlSerializable , tel qu'utilisé par XmlSerializer etc.

Pour les besoins de DTO, BinaryFormatter doit être évité - des éléments tels que xml (via XmlSerializer ou DataContractSerializer ) ou json sont bons, car cross formats de plate-forme tels que les tampons de protocole.

Pour être complet, protobuf-net inclut des points d'ancrage pour ISerializable (vous permettant d'utiliser un format binaire portable sans écrire beaucoup de code), mais BinaryFormatter ne serait pas votre premier choix ici de toute façon.

Autres conseils

Les classes peuvent être sérialisées dans .NET de deux manières:

  1. Marquage de la classe avec SerializableAttribute et décoration de tous les champs que vous ne souhaitez pas vouloir mettre en série avec l'attribut NonSerialized . (Comme le souligne Marc Gravell, BinaryFormatter , qui est la classe généralement utilisée pour formater les objets ISerializable , sérialise automatiquement tous les champs, sauf indication contraire explicite.)
  2. Implémentation de l'interface ISerializable pour une sérialisation entièrement personnalisée.

Le premier est plus simple à utiliser car il consiste simplement à marquer des déclarations avec des attributs, mais son pouvoir est limité. Ce dernier permet plus de flexibilité mais demande beaucoup plus d'efforts à mettre en œuvre. Lequel vous devriez utiliser dépend complètement du contexte.

En ce qui concerne ce dernier ( ISerializable ) et son utilisation, j'ai cité l'extrait page MSDN pour l'interface:

  

Toute classe pouvant être sérialisée   doit être marqué avec le   SerializableAttribute. Si une classe   doit contrôler sa sérialisation   processus, il peut mettre en œuvre le   Interface sérialisable. Le formateur   appelle GetObjectData à   temps de sérialisation et remplit la   fourni SerializationInfo avec tous   les données nécessaires pour représenter le   objet. Le formateur crée un   SerializationInfo avec le type de   objet dans le graphique. Objets qui ont besoin   d'envoyer des procurations pour eux-mêmes peuvent utiliser   les FullTypeName et AssemblyName   méthodes sur SerializationInfo pour changer   les informations transmises.

     

Dans le cas de l'héritage de classe, il   est possible de sérialiser une classe   dérive d'une classe de base qui   implémente ISerializable. Dans ce   Dans ce cas, la classe dérivée doit appeler   l'implémentation de classe de base de   GetObjectData dans son   implémentation de GetObjectData.   Sinon, les données de la base   la classe ne sera pas sérialisée.

Avec ISerializable , vous pouvez écrire des méthodes personnalisées dans votre objet pour prendre en charge la sérialisation lors de la sérialisation binaire, pour sérialiser vos objets d'une manière différente de celle utilisée par l'approche par défaut de BinaryFormatter. <

En d'autres termes, si l'approche par défaut sérialise votre objet d'une manière différente de celle souhaitée, vous pouvez implémenter ISerializable pour un contrôle complet. Notez que main dans la main avec ISerializable, il existe également un constructeur personnalisé que vous devez implémenter.

XmlSerialization utilisera bien sûr uniquement les propriétés, ISerializable n’a rien à voir avec la sérialisation XML.

Merci Marc et Pop pour les commentaires, ma première réponse m'a un peu précipitée.

Pour rendre un objet "transportable", vous devez le sérialiser. Par exemple, si vous souhaitez transférer des données d'objet à l'aide de .NET Remoting ou de Web Services, vous devez fournir des méthodes qui sérialisent vos données d'objet, en réduisant vos instances d'objet dans un format transportable qui représente une représentation haute fidélité de l'objet.

Vous pouvez ensuite également prendre la représentation sérialisée, la transférer dans un autre contexte, tel qu'une machine différente, et reconstruire votre objet d'origine.

Lors de l'implémentation de l'interface ISerializable , une classe doit fournir la méthode GetObjectData incluse dans l'interface, ainsi qu'un constructeur spécialisé spécialisé pour accepter deux paramètres: une instance de SerializationInfo et une instance de StreamingContext.

Si vos classes ne nécessitent pas de contrôle précis de l'état de leurs objets, vous pouvez simplement utiliser l'attribut [Serializable] . Les classes nécessitant davantage de contrôle sur le processus de sérialisation peuvent implémenter l'interface ISerializable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top