28 votes

Que fait [System.SerializableAttribute()] ?

Je regarde le code C# de quelqu'un d'autre et avant un enum public il y a les lignes suivantes :

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]

Quelqu'un peut-il expliquer en termes simples ce qu'est le SerializableAttribute La ligne de démarcation est le fait ?

J'ai déjà rencontré cette page - cela n'avait pas beaucoup de sens pour moi - je suis novice en C#.

75voto

Marc Gravell Points 482669

C'est en fait assez subtil...

En surface la réponse est simplement "il ajoute le SerializableAttribute aux métadonnées de la classe", lorsque l'objectif de la SerializableAttribute est de faire de la publicité (pour des choses comme BinaryFormatter ) qu'un type peut être sérialisé. BinaryFormatter refusera de sérialiser les choses qui ne sont pas explicitement annoncées pour la sérialisation. Cela peut être une conséquence de BinaryFormatter utilisée pour mettre en œuvre remoting et d'empêcher les fuites accidentelles de données à travers une frontière de remoting.

Notez que la plupart des sérialiseurs ne soins à propos de SerializableAttribute , de sorte que cette sólo a un impact sur des éléments tels que BinaryFormatter . Par exemple, aucun des XmlSerializer , DataContractSerializer , JavaScriptSerializer JSON.NET ou protobuf-net s'intéressent-ils vraiment ? SerializableAttribute .

Cependant, en fait , il est no est un attribut standard, mais il fait l'objet d'un traitement particulier par le compilateur :

  • la plupart des attributs sont techniquement .custom instance valeurs (en termes de VA)
  • cependant, SerializableAttribute correspond en fait à un CLI .class drapeau, serializable

Cela ne change rien à la sens mais : comme un fait nouveau, SerializableAttribute n'est pas réellement mis en œuvre en tant que attribut .

13voto

Cristian Chereches Points 495

L'attribut System.SerializableAttribute spécifie à l'exécution que les instances de cette classe peuvent être sérialisées

Par exemple, vous renvoyez un objet lors d'un appel de service WCF. Si cet objet possède cet attribut et que tous les objets qu'il contient sont sérialisables, le moteur d'exécution transformera cet objet en JSON ou en XML, en fonction du type de ressource renvoyée par le service web.

7voto

James Wiseman Points 18347

Il s'agit simplement d'une main longue pour [Serializable] . Il marque la classe comme pouvant être "convertie" vers et depuis d'autres formats.

Parmi les exemples courants, on peut citer la "sérialisation" d'une classe "vers" une structure de données JSON ou XML, ainsi que la conversion équivalente "à partir" de ces structures.

Considérons une classe

[Serializable]
class MyClass
{
    public string Mem1 {get; set;}
    public string Mem2 {get; set;}
}

...
MyClass mc = new MyClass;
mc.Mem1 = "Hello";
mc.Mem2 = "World";

Lorsqu'il est sérialisé dans une structure JSON, nous obtenons :

"{'Mem1':'Hello','Mem2':'World'}"

Et compte tenu de la nature bidirectionnelle du processus, si nous recevions des informations dans ce format (par exemple, en retour d'un service web), nous pourrions les sérialiser dans une instance de cette classe.

Sur la base de l'exemple JSON, nous trouvons une série de classes dans l'espace de noms System.Web.Script.Serialization qui peut nous aider dans ce domaine. En particulier, le JavaScriptSerializer nous aide à fournir Serialize() y Deserialize des méthodes.

-1voto

larsm Points 5337

De la documentation :

Indique qu'une classe peut être sérialisée

Voir la documentation pour un exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X