80 votes

Quelle est la différence entre l'utilisation de l'attribut Serializable et la mise en œuvre ISerializable?

Quelle est la différence entre l'utilisation de l'attribut Serializable et la mise en œuvre de l'interface ISerializable?

45voto

t0mm13b Points 21031

Lorsque vous utilisez l' SerializableAttribute d'attribut vous de mettre un attribut sur un terrain au moment de la compilation d'une manière telle que, lorsque, au moment de l'exécution, la sérialisation des installations de savoir ce que sérialiser sur la base des attributs en effectuant une réflexion sur la classe/module/type de montage.

[Serializable]
public class MyFoo { … }

Le ci-dessus indique que la sérialisation des installations de sérialiser l'ensemble de la classe MyFoo, considérant ce qui suit:

public class MyFoo
{
    private int bar;

    [Serializable]
    public int WhatBar
    {
       get { return this.bar; }
    }
}

À l'aide de l'attribut que vous pouvez choisir les champs qui doit être sérialisé.

Lorsque vous implémentez l' ISerializable interface, la sérialisation est en fait remplacé par une version personnalisée, par des raisons impérieuses GetObjectData et SetObjectData (et en fournissant un constructeur de la forme MyFoo(SerializationInfo info, StreamingContext context)), il y aurait un meilleur niveau de contrôle sur la sérialisation des données.

Voir aussi cet exemple de sérialisation personnalisée ici sur StackOverflow. Il montre comment garder la sérialisation rétro-compatible avec les différents versionings des données sérialisées.

Espérons que cette aide.

23voto

Segfault Points 3311

Le SerializableAttribute instruit le cadre du processus de sérialisation par défaut. Si vous avez besoin de plus de contrôle, vous pouvez implémenter l' interface ISerializable. Ensuite vous mettez le votre propre code pour sérialiser l'objet dans l' GetObjectData méthode et mise à jour de l' SerializationInfo objet qui est passé dans.

5voto

Asad Butt Points 8989

L' ISerializable interface vous permet de mettre en œuvre la sérialisation personnalisée d'autres que par défaut. Lorsque vous implémentez l' ISerializable interface, vous devez remplacer GetObjectData méthode comme suit

public void GetObjectData (SerializationInfo serInfo, 
                                    StreamingContext streamContext)
{
   // Implement custom Serialization
}

2voto

Andrey Points 36869

ISerialize vous forcer à mettre en œuvre logique de sérialisation manially, tandis que le marquage par attribut Serializable (avez-vous dire?) dira Binaire sérialiseur que cette classe peut être sérialisé. Il le fera automatiquement.

0voto

logicnp Points 4509

Héritant de ISerializable vous permet de coutume de mettre en œuvre la (dé)sérialisation. Lorsque vous utilisez uniquement l'attribut Serializable, la (dé)sérialisation peut être contrôlé uniquement par des attributs et est moins souple.

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