J'ai découvert que certaines classes utilisent l'attribut [Serializable]
.
Lorsque vous créez un objet dans une application .Net Framework, vous n'avez pas besoin de penser à la manière dont les données sont stockées en mémoire. Parce que .Net Framework s’occupe de cela pour vous. Toutefois, si vous souhaitez stocker le contenu d'un objet dans un fichier, envoyer un objet à un autre processus ou le transmettre sur le réseau, vous devez réfléchir à la façon dont l'objet est représenté, car vous devrez effectuer une conversion en un autre format. . Cette conversion s'appelle SERIALISATION.
La sérialisation permet au développeur de sauvegarder l'état d'un objet et de le recréer au besoin, en offrant le stockage des objets ainsi que l'échange de données. Grâce à la sérialisation, un développeur peut effectuer des actions telles qu'envoyer l'objet à une application distante au moyen d'un service Web, en passant d'un objet à un autre, en passant un pare-feu sous la forme d'une chaîne XML ou en maintenant une sécurité ou des paramètres spécifiques à l'utilisateur. informations sur les applications.
Appliquez SerializableAttribute
à un type pour indiquer que des instances de ce type peuvent être sérialisées. Appliquez SerializableAttribute
même si la classe implémente également l'interface ISerializable
pour contrôler le processus de sérialisation.
Tous les champs publics et privés d'un type marqués par SerializableAttribute
sont sérialisés par défaut, sauf si le type implémente l'interface ISerializable
pour remplacer le processus de sérialisation. Le processus de sérialisation par défaut exclut les champs marqués avec NonSerializedAttribute
. Si un champ d'un type sérialisable contient un pointeur, un descripteur ou une autre structure de données spécifique à un environnement particulier et ne pouvant pas être reconstitué de manière significative dans un environnement différent, vous souhaiterez peut-être appliquer NonSerializedAttribute
= à ce champ.
Voir MSDN pour plus de détails.
Éditer 1
Toute raison de ne pas marquer quelque chose comme sérialisable
Lorsque vous transférez ou enregistrez des données, vous devez envoyer ou enregistrer uniquement les données requises. Il y aura donc moins de retards de transfert et de problèmes de stockage. Ainsi, vous pouvez désactiver une partie inutile des données lors de la sérialisation.
Quelques utilisations pratiques de l'attribut [Serializable]
:
BinaryFormatter
dans System.Runtime.Serialization.Formatters.Binary.Clipboard.SetData()
- les classes non sérialisables ne peut pas être placée dans le presse-papiers.MarshalByRefObject
) doit être sérialisable.Ce sont les cas d'utilisation les plus courants que j'ai rencontrés.
Comme la question initiale concernait SerializableAttribute, il convient de noter que cet attribut ne s'applique que lors de l'utilisation de BinaryFormatter ou de SoapFormatter.
C'est un peu déroutant, à moins que vous ne prêtiez vraiment attention aux détails, de savoir quand l'utiliser et quel est son objectif réel.
Cela n'a rien à voir avec la sérialisation XML ou JSON.
SerializableAttribute est utilisé avec les interfaces ISerializable et SerializationInfo. Celles-ci ne sont également utilisées qu'avec BinaryFormatter ou SoapFormatter.
Sauf si vous avez l'intention de sérialiser votre classe à l'aide de Binary ou Soap, ne vous embêtez pas de marquer votre classe comme étant [Serializable]. Les sérialiseurs XML et JSON ne sont même pas conscients de son existence.
La sérialisation est le processus de conversion d'un objet en un flux d'octets afin de stocker l'objet ou de le transmettre à la mémoire, à une base de données ou à un fichier.
Comment fonctionne la sérialisation
Cette illustration montre le processus global de la sérialisation.
L'objet est sérialisé en un flux, qui contient non seulement les données, mais également des informations sur le type de l'objet, telles que sa version, sa culture et son nom d'assembly. À partir de ce flux, il peut être stocké dans une base de données, un fichier ou une mémoire.
Voici un court exemple du fonctionnement de la sérialisation. J'apprenais aussi la même chose et j'ai trouvé deux liens utiles. Qu'est-ce que la sérialisation et comment le faire en .NET .
n exemple de programme expliquant la sérialisation
Si vous ne comprenez pas le programme ci-dessus, un programme très simple avec des explications est fourni ici .
Sérialisation
La sérialisation est le processus de conversion d'un objet ou d'un ensemble d'objets graphique en flux, il s'agit d'un tableau d'octets dans le cas d'une sérialisation binaire.
tilisations de la sérialisation
Vous trouverez ci-dessous des attributs personnalisés utiles utilisés lors de la sérialisation d'un objet
[Sérialisable] -> Il est utilisé lorsque nous marquons le sérialisable d’un objet [Non Serialized] -> Il est utilisé lorsque nous ne voulons pas sérialiser le champ d’un objet. [OnSerializing] -> Il est utilisé lorsque nous voulons effectuer une action lors de la sérialisation d'un objet [OnSerialized] -> Il est utilisé lorsque nous voulons effectuer une action après la sérialisation un objet en flux.
Voici l'exemple de la sérialisation
[Serializable]
internal class DemoForSerializable
{
internal string Fname = string.Empty;
internal string Lname = string.Empty;
internal Stream SerializeToMS(DemoForSerializable demo)
{
DemoForSerializable objSer = new DemoForSerializable();
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, objSer);
return ms;
}
[OnSerializing]
private void OnSerializing(StreamingContext context) {
Fname = "sheo";
Lname = "Dayal";
}
[OnSerialized]
private void OnSerialized(StreamingContext context)
{
// Do some work after serialized object
}
}
Voici le code d'appel
class Program
{
string fname = string.Empty;
string Lname = string.Empty;
static void Main(string[] args)
{
DemoForSerializable demo = new DemoForSerializable();
Stream ms = demo.SerializeToMS(demo);
ms.Position = 0;
DemoForSerializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializable;
Console.WriteLine(demo1.Fname);
Console.WriteLine(demo1.Lname);
Console.ReadLine();
}
}