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

StackOverflow https://stackoverflow.com/questions/2365152

Question

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

Était-ce utile?

La solution

Lorsque vous utilisez le SerializableAttribute attribut que vous mettez un attribut sur un champ à la compilation de telle sorte que, lorsqu'au moment de l'exécution, les installations de sérialisation sauront quoi sérialisation en fonction des attributs en effectuant une réflexion sur la classe / module / type de montage .

[Serializable]
public class MyFoo { … }

Ce qui précède indique que l'installation de sérialisation doivent sérialiser la MyFoo toute la classe, alors que:

public class MyFoo
{
    private int bar;

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

En utilisant l'attribut que vous pouvez choisir de manière sélective les champs besoins à sérialiser.

Lorsque vous implémentez le interface ISerializable , la sérialisation se efficacement outrepassée avec une version personnalisée, en remplaçant GetObjectData et SetObjectData (et en fournissant un constructeur de la forme MyFoo(SerializationInfo info, StreamingContext context)), il y aurait un degré plus fin de contrôle sur la sérialisation des données.

Voir aussi cet exemple d'une sérialisation personnalisée ici sur StackOverflow . Il montre comment garder la sérialisation rétrocompatible avec les différentes versionings des données sérialisés.

Hope this helps.

Autres conseils

Le SerializableAttribute indique le cadre de faire la sérialisation par défaut processus. Si vous avez besoin d'un plus grand contrôle, vous pouvez mettre en œuvre le ISerializable interface. Ensuite, vous mettez le votre propre code pour sérialiser l'objet dans la méthode GetObjectData et mettre à jour l'objet SerializationInfo qui est passé à elle.

L'interface ISerializable vous permet d'implémenter sérialisation personnalisé autre que par défaut. Lorsque vous implémentez l'interface ISerializable, vous devez remplacer la méthode de GetObjectData comme suit

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

ISerialize la force vous de mettre en œuvre la logique de sérialisation manially, tout en marquant par attribut Serializable (avez-vous l'entendez?) Nous le dira sérialiseur binaire que cette classe peut être sérialisée. Il le fera automatiquement.

Héritant de ISerializable vous permet d'implémenter la sérialisation personnalisée (de). Lors de l'utilisation que l'attribut Serializable, la (dé) sérialisation peut être commandé uniquement par des attributs et est moins flexible.

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