Quelle est la différence entre l'utilisation de l'attribut Serializable et la mise en œuvre de l'interface ISerializable?
Réponses
Trop de publicités?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 (et en fournissant un constructeur de la forme SetObjectData
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.
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.
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
}