Question

Je suis tombé sur cette question sur Transcending:

Que devez-vous s'appliquer à un champ si sa valeur n'est pas requise pendant la désérialisation?

Me = [non ssérialisé], réponse = [FacultationalField

Ma réaction intestinale a été non ssérialisée mais transcendante dit que je me trompe. J'ai une bonne idée de ce qu'il faut rechercher en ce qui concerne l'attribut [non mérités], mais j'aimerais vraiment que cela soit effacé.

Pour autant que je sache, le premier a une relation avec les conflits de version entre les versions plus récentes et plus anciennes du même assemblée. Ce dernier est plus soucieux de ne pas sérialiser un champ Fullstop. Y a-t-il autre chose qui pourrait distinguer ces deux-là? MSDN ne dit pas vraiment à ce sujet car ils sont tous les deux utilisés sur les formations binaires et SOAPFormatter avec le XMLFormatter à l'aide du XMLIGNOREATTRIBUT.

Ma deuxième question est que pouvez-vous mélanger et assortir l'un des deux attributs? Je n'ai pas encore utilisé.

Il suffit de lancer celui-ci là-bas, mais ma réponse a-t-elle quelque chose à voir avec la façon dont l'interface IDeSerilizationCallback est implémentée?

METTRE À JOUR:

Je sais que l'attribut de champ facultatif ne sérialise pas la valeur détenue par un membre de données, mais non ssérialisé ne sérialisera même pas le membre de données ou sa valeur.

Était-ce utile?

La solution

Ces deux attributs sont utilisés pour les côtés opposés de l'équation de sérialisation.

Lorsque vous utilisez [NonSerialized], vous dites que "ce champ ne doit pas du tout être sérialisé" - donc c'est plus un attribut "Save Time". Fondamentalement, vous dites que le champ n'a pas d'importance pour l'état sérialisé de l'objet.

Lorsque vous utilisez [OptionalField], d'un autre côté, vous allez toujours sérialiser le champ. Cependant, si le champ est disparu à Temps de lecture (lorsque le flux est désérialisé en un objet), aucune exception ne sera soulevée. Cet attribut est vraiment destiné à vous permettre d'ajouter un nouveau champ à un type de série existant, sans rompre la compatibilité. Les anciennes versions de l'objet (qui manquent ce champ) seront désérialisées normalement.

Autres conseils

Je joue juste à la langue anglaise, non requis et optionnel signifie la même chose dans ce cas.

Pour votre première question, vous l'avez à peu près cloué sur la tête. [OptionalField] Fondamentalement, permet aux sérialisations plus anciennes d'être compatibles avec les définitions plus récentes. [NonSerialized] signifie que vous ne le trouverez pas dans les données sérialisées.

Compte tenu des différences, je ne peux pas imaginer pourquoi vous meriez les deux sur un seul champ mais je suppose que le compilateur se plaindrait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top