Qu'est-ce que [Sérialisable] et quand dois-je l'utiliser?

Réponses:

368

Qu'Est-ce que c'est?

Lorsque vous créez un objet dans une application de framework .Net, vous n'avez pas besoin de penser à la façon dont les données sont stockées en mémoire. Parce que le .Net Framework s'en occupe pour vous. Cependant, si vous souhaitez stocker le contenu d'un objet dans un fichier, envoyer un objet à un autre processus ou le transmettre à travers le réseau, vous devez penser à la façon dont l'objet est représenté car vous devrez convertir dans un format différent . Cette conversion est appelée 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 selon les besoins, en fournissant un stockage des objets ainsi qu'un échange de données. Grâce à la sérialisation, un développeur peut effectuer des actions telles que l'envoi de l'objet à une application distante au moyen d'un service Web, le passage d'un objet d'un domaine à un autre, le passage d'un objet à travers un pare-feu en tant que chaîne XML ou le maintien de la sécurité ou spécifique à l'utilisateur informations entre les applications.

Appliquer SerializableAttributeà un type pour indiquer que les instances de ce type peuvent être sérialisées. Appliquez le SerializableAttributemême si la classe implémente également l' ISerializableinterface pour contrôler le processus de sérialisation.

Tous les champs publics et privés d'un type qui sont marqués par le SerializableAttributesont sérialisés par défaut, sauf si le type implémente l' ISerializableinterface 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 peut 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.

Modifier 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. Vous pouvez donc désactiver un bloc de données inutile lors de la sérialisation.

CharithJ
la source
1
@dwbartz Votre question trouve sa réponse ici link
jayasurya_j
2
Belle explication, ce serait bien d'ajouter ceci à l'attribut dans MSDN =)
Martea
@jayasurya_j Dommage que la réponse acceptée ne parle pas beaucoup des parties intimes
Alexander
1
Bonne explication
Zakir HC
42

Quelques utilisations pratiques de l' [Serializable]attribut:

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

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

Bradley Smith
la source
42

Étant donné que la question d'origine concernait le SerializableAttribute, il convient de noter que cet attribut ne s'applique que lors de l'utilisation de BinaryFormatter ou SoapFormatter.

C'est un peu déroutant, à moins que vous ne prêtiez vraiment attention aux détails, quant au moment de l'utiliser et à son objectif réel.

Cela n'a RIEN à voir avec la sérialisation XML ou JSON.

L'interface ISerializable et la classe SerializationInfo sont utilisées avec SerializableAttribute. Ils ne sont également utilisés qu'avec le BinaryFormatter ou le SoapFormatter.

À moins que vous n'ayez l'intention de sérialiser votre classe en utilisant Binary ou Soap, ne vous embêtez pas à marquer votre classe comme [Serializable]. Les sérialiseurs XML et JSON ne sont même pas conscients de son existence.

BLaminack
la source
16
"Cela n'a RIEN à voir avec la sérialisation XML ou JSON" - MERCI! Enfin une explication pour laquelle je peux sérieusement sérialiser n'importe quelle classe en XML avec ou sans cet attribut
userSteve
1
Avez-vous une source pour cela?
Michiel van Oosterhout
"Les sérialiseurs XML et JSON ne sont même pas conscients de son existence". Je n'en sais rien. Lorsque j'ai formaté une classe JSON via WCF, les noms de propriété sont sortis avec un trait de soulignement précédent si la classe l'était Serializable, et sans quand l'attribut a été supprimé. Une certaine interférence est donc possible.
Jens
@Jens si j'ai bien compris JSON.net s'en fiche un peu mais asp.net change un peu ce comportement. Je pense que vous pouvez contourner cela avec les attributs JsonObject / JsonProperty.
Base du
29

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.

Fonctionnement de la sérialisation

Cette illustration montre le processus global de sérialisation.

entrez la description de l'image ici

L'objet est sérialisé en un flux, qui transporte non seulement les données, mais des informations sur le type de l'objet, telles que sa version, sa culture et le nom de l'assembly. À partir de ce flux, il peut être stocké dans une base de données, un fichier ou une mémoire.

Détails en msdn.

Mahbubur Rahman
la source
14

Sérialisation

La sérialisation est le processus de conversion d'un objet ou d'un ensemble d'objets graphique en un flux, c'est un tableau d'octets dans le cas de la sérialisation binaire

Utilisations de la sérialisation

  1. Pour enregistrer l'état d'un objet dans un fichier, une base de données, etc. et l'utiliser ensuite.
  2. Pour envoyer un objet d'un processus à un autre (domaine d'application) sur la même machine et également l'envoyer par câble à un processus exécuté sur une autre machine.
  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

Voici quelques attributs personnalisés utiles qui sont utilisés lors de la sérialisation d'un objet

[Serializable] -> Il est utilisé lorsque nous marquons le sérialisable d'un objet [NonSerialized] -> 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 avoir sérialisé 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();
        }

    }
Sheo Dayal Singh
la source