Quelle est la différence entre l'utilisation de l'attribut Serializable et la mise en œuvre ISerializable?
-
23-09-2019 - |
Question
Quelle est la différence entre l'utilisation de l'attribut Serializable
et mettre en œuvre l'interface ISerializable
?
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 (et en fournissant un constructeur de la forme SetObjectData
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.