49 votes

Quel est l'intérêt de l'interface ISerializable ?

Il semble que je peux sérialiser les classes qui n'ont pas cette interface, donc je ne suis pas clair sur son but.

65voto

Marc Gravell Points 482669

ISerializable est utilisé pour personnaliser la sérialisation binaire, généralement pour BinaryFormatter (et peut-être pour l'accès distant à des fins). Sans cela, il utilise les champs, qui peut être:

  • inefficace; si il y a des champs qui ne sont utilisées que pour l'efficacité à l'exécution, mais peut être enlevé pour la sérialisation (par exemple, un dictionnaire peut être différent lorsqu'ils sont sérialisés)
  • inefficace; que, même pour les champs qui sont nécessaires, il doit inclure un grand nombre de métadonnées supplémentaires
  • non valide; si il y a des champs qui ne peuvent pas être sérialisé (tels que les délégués des événements, bien qu'ils peuvent être marqués [NonSerialized])
  • fragile; votre la sérialisation est maintenant lié au champ de noms mais les champs sont destinés à être un détail de l'implémentation; voir aussi de Dissimulation, de la sérialisation et les propriétés implémentées automatiquement

Par la mise en œuvre de ISerializable vous pouvez fournir votre propre mécanisme de sérialisation binaire. Notez que le code xml équivalent de ce qui est IXmlSerializable, utilisée par XmlSerializer etc.

Pour DTO fins, BinaryFormatter doit être évitée - des choses comme xml (via XmlSerializer ou DataContractSerializer) ou json sont bonnes, tout comme la croix-plate-forme des formats tels que le protocole sur les zones tampons.

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

9voto

Noldorin Points 67794

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

  1. Le marquage de la classe avec l' SerializableAttribute et la décoration de tous les champs que vous ne voulez être sérialisé avec l' NonSerialized d'attribut. (Marc Gravel souligne, BinaryFormatter, qui est la classe généralement utilisé pour le format ISerializable objets, sérialise automatiquement tous les champs, sauf s'ils sont spécifiquement mention contraire.)
  2. La mise en œuvre de l' ISerializable interface pour la sérialisation personnalisée.

Le premier est plus simple à utiliser qu'il s'agit simplement de marquage des déclarations d'attributs, mais il est limité dans son pouvoir. Ce dernier permet plus de flexibilité, mais prend beaucoup plus d'efforts à mettre en œuvre. Lequel vous devez utiliser dépend entièrement du contexte.

Concernant ce dernier (ISerializable) et de l'usage, je l'ai cité à partir de la page MSDN pour l'interface:

Toute classe qui peut être sérialisé doivent être marqués avec l' SerializableAttribute. Si une classe besoin de contrôle de la sérialisation processus, il peut mettre en œuvre la Interface ISerializable. Le Formateur appelle la GetObjectData à la sérialisation de temps et remplit la fourni SerializationInfo avec tous les les données nécessaires à la représentation de la objet. Le Formateur crée un SerializationInfo avec le type de la objet dans le graphique. Les objets qui en ont besoin pour envoyer des procurations pour eux-mêmes peuvent utiliser le 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 qui dérive d'une classe de base qui met en œuvre ISerializable. Dans ce cas, la classe dérivée doit appeler la classe de base de la mise en œuvre de GetObjectData à l'intérieur de son la mise en œuvre de GetObjectData. Sinon, les données de la base la classe va pas être sérialisé.

5voto

Lasse V. Karlsen Points 148037

Avec l' ISerializable vous pouvez écrire des méthodes personnalisées de votre objet à prendre plus de sérialisation lors de sérialisation binaire, pour sérialiser des objets d'une manière différente que ce que l'approche par défaut utilisé par BinaryFormatter fera.

En d'autres termes, si l'approche par défaut sérialise l'objet dans une manière différente de celle dont vous voulez qu'il sérialiser que, vous pouvez mettre en œuvre ISerializable pour un contrôle complet. Notez que la main dans la main avec ISerializable, il y a aussi un constructeur personnalisé, vous devriez mettre en œuvre.

XmlSerialization n'utiliser les propriétés, ISerializable n'a rien à voir avec la sérialisation XML.

Merci Marc et de la Pop pour les commentaires, j'ai été un peu vite, avec ma première réponse.

3voto

splattne Points 48126

Afin de rendre un objet "transportable", vous avez à sérialiser. Par exemple, si vous voulez transférer les données de l'objet à l'aide .NET Remoting ou de Services Web, vous devez fournir des méthodes qui sérialise l'objet de votre de données, la réduction de vos instances de l'objet dans un format transportable qui représente une haute-fidélité de la représentation de l'objet.

Ensuite, vous pouvez également prendre la représentation sérialisée, le transporter dans un autre contexte comme une machine différente, et la reconstruction de votre objet original.

Lors de la mise en œuvre de l' ISerializable interface, une classe doit fournir la méthode GetObjectData qui est inclus dans l'interface, ainsi que d'un constructeur spécialisé, qui s'est spécialisé accepter deux paramètres: une instance de SerializationInfo, et une instance de StreamingContext.

Si vos classes ne nécessitent pas un contrôle précis de leur état de l'objet, alors vous pouvez simplement utiliser [Serializable] d'attribut. Les Classes qui exigent plus de contrôle sur le processus de sérialisation peut implémenter l'interface ISerializable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X