2013-06-17 4 views
7

Le livre CLR Via C# présente un moyen simple de cloner des objets via la sérialisation binaire.Que fait réellement StreamingContextStates.Clone?

Il précise StreamingContextStates.Clone lors de la création du BinaryFormatter comme ceci:

var formatter = new BinaryFormatter 
{ 
    Context = new StreamingContext(StreamingContextStates.Clone) 
}; 

The documentation for StreamingContextStates.Clone dit qu'il

Indique que le graphe d'objet est cloné. Les utilisateurs peuvent supposer que le graphique cloné continuera à exister dans le même processus et qu'il est sûr d'accéder aux descripteurs ou à d'autres références à des ressources non gérées.

Bien assez bien - mais je ne sais pas vraiment ce que cela signifie réellement. En quoi cela change-t-il réellement le comportement du BinaryFormatter? Quelqu'un peut-il énumérer les effets concrets que l'utilisation de ce drapeau a?

+3

Pour mémoire, je ** fortement ** vous suggère d'éviter 'BinaryFormatter', eh bien, la plupart des cas. Il y a des choses à portée de main, mais j'ai vu * tant * de personnes * souffrir * tant de choses ... en effet, les problèmes de 'BinaryFormatter 'faisaient partie des raisons pour lesquelles je me suis beaucoup impliqué dans la sérialisation quelques années en arrière –

+3

Cette propriété est réexposée dans 'ISerializable.GetObjectData (...)', donc techniquement toute implémentation ** pourrait en théorie ** choisir de faire quelque chose de différent en fonction de la valeur 'StreamingContextStates'. Je ne sais pas combien, le cas échéant *, mais –

+0

@MarcGravell Intéressant, merci. (Et peut-être que cet échantillon devrait être retiré de CLR Via C# pour la prochaine édition alors.) –

Répondre

2

La sérialisation fait l'objet ici.
MS a fourni un mini-cadre "abstrait" pour permettre la sérialisation des objets.
Le formatage binaire est une implémentation spécifique de ces concepts de mini-framework.

Un développeur peut choisir d'utiliser ces concepts de cadre pour créer son propre formateur personnalisé - ou -
MS lui-même lors de la création de la mini-structure pensée de l'implémentation ultérieure de la sérialisation. Donc, ils ont fourni ces drapeaux dans le cadre.

Pour répondre à votre question spécifique: ces drapeaux n'auront aucun effet sur le formateur binaire car il est déjà implémenté comme un outil (si vous voulez) pour suivre le graphe d'objet et le convertir simplement en octets de données brutes.
Si vous créez votre propre sérialiseur qui, par exemple, peut enregistrer l'objet dans une base de données ou dans un fichier ou dans une mémoire partagée ou autre, vous voulez que l'utilisateur qui utilise votre sérialiseur spécifie l'indicateur correspondant.

À moins que je totalement mal compris MS devs depuis 2003 .. :) (ce qui est possible!)

Questions connexes