web-dev-qa-db-fra.com

Qu'est-ce que [Serializable] et quand dois-je l'utiliser?

J'ai découvert que certaines classes utilisent l'attribut [Serializable].

  • Qu'Est-ce que c'est?
  • Quand devrais-je l'utiliser?
  • Quels types d'avantages vais-je recevoir?
300
kevin

Qu'Est-ce que c'est?

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.

Utilisations pour la sérialisation

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.

356
CharithJ

Quelques utilisations pratiques de l'attribut [Serializable]:

  • Enregistrement de l'état de l'objet à l'aide de la sérialisation binaire; vous pouvez très facilement "enregistrer" des instances d'objet entières de votre application dans un fichier ou un flux réseau, puis les recréer en les désérialisant. Consultez la classe BinaryFormatter dans System.Runtime.Serialization.Formatters.Binary.
  • L'écriture de classes dont les occurrences d'objets peuvent être stockées dans le presse-papiers à l'aide de Clipboard.SetData() - les classes non sérialisables ne peut pas être placée dans le presse-papiers.
  • Écrire des classes compatibles avec .NET Remoting; En règle générale, toute instance de classe que vous passez entre des domaines d'application (à l'exception de ceux qui s'étendent de MarshalByRefObject) doit être sérialisable.

Ce sont les cas d'utilisation les plus courants que j'ai rencontrés.

38
Bradley Smith

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.

29
BLaminack

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.

enter image description here

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.

Détails dans msdn.

27
Mahbubur Rahman

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 .

18
Akshay

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

  1. Pour enregistrer l'état d'un objet dans un fichier, une base de données, etc. et l'utiliser plus tard.
  2. Pour envoyer un objet d'un processus à un autre (Domaine d'application) sur le même ordinateur et l'envoyer également par câble à un processus exécuté sur un autre ordinateur.
  3. Pour créer un clone de l'objet d'origine en tant que sauvegarde tout en travaillant sur l'objet principal.
  4. Un ensemble d’objets peut facilement être copié dans le presse-papiers du système, puis collé dans la même application ou dans une autre.

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();
        }

    }
12
Sheo Dayal Singh