web-dev-qa-db-fra.com

Quelle est la différence entre l'utilisation de l'attribut Serializable implémentant ISerializable?

Quelle est la différence entre l'utilisation de l'attribut Serializable et l'implémentation de l'interface ISerializable?

73
SoftwareGeek

Lorsque vous utilisez l'attribut SerializableAttribute vous placez un attribut sur un champ au moment de la compilation de telle manière que lors de l'exécution, les installations de sérialisation sauront quoi sérialiser en fonction sur les attributs en effectuant une réflexion sur le type de classe/module/assemblage.

[Serializable]
public class MyFoo { … }

Ce qui précède indique que la fonction de sérialisation doit sérialiser la classe entière MyFoo, alors que:

public class MyFoo
{
    private int bar;

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

À l'aide de l'attribut, vous pouvez choisir de manière sélective les champs à sérialiser.

Lorsque vous implémentez l'interface ISerializable , la sérialisation est effectivement remplacée par 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é de contrôle plus fin sur la sérialisation des données.

Voir aussi cet exemple de sérialisation personnalisé ici sur StackOverflow . Il montre comment conserver la sérialisation rétrocompatible avec différents versions des données sérialisées.

J'espère que cela t'aides.

41
t0mm13b

SerializableAttribute indique au framework d'effectuer le processus de sérialisation par défaut. Si vous avez besoin de plus de contrôle, vous pouvez implémenter ISerializable interface . Ensuite, vous devez mettre votre propre code pour sérialiser l'objet dans la méthode GetObjectData et mettre à jour l'objet SerializationInfo qui lui est transmis.

20
Segfault

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

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

ISerialize vous force à implémenter la logique de sérialisation de manière maniaque, tandis que le marquage par attribut Serializable (vouliez-vous dire?) Indiquera au sérialiseur binaire que cette classe peut être sérialisée. Il le fera automatiquement.

1
Andrey

L'héritage de ISerializable vous permet d'implémenter de manière personnalisée la (dé) sérialisation. Lorsque vous utilisez uniquement l'attribut Sérialisable, la (dé) sérialisation ne peut être contrôlée que par des attributs et est moins flexible.

0
logicnp