Question

Quelqu'un sait-il pourquoi le NetDataContractSerializer pourrait ajouter des entrées « néant » dans une collection sérialisé?

Par exemple,

  <Jobs z:Id="17">
    <_items z:Id="18" z:Size="4">
      <JobRecord z:Id="19">
        <Name z:Id="20">Job1</Name>
      </JobRecord>
      <JobRecord i:nil="true" />
      <JobRecord i:nil="true" />
      <JobRecord i:nil="true" />
    </_items>
    <_size>1</_size>
    <_version>2</_version>
  </Jobs>

Remarquez les trois entrées supplémentaires « JobRecord » et l'élément supplémentaire en disant « hey, je sais qu'il ya quatre nœuds ici, mais seulement l'un d'entre eux signifie quoi que ce soit. »

Il semble comme un comportement étrange. Ok, donc je pouvais voir que les pairs NDC profondément dans le graphe d'objet et pourrait être tripotant avec une matrice de support qui a une taille qui est supérieur au nombre d'objets sérialisé (pensez du tableau de support pour une liste).

Est-ce que ce qui se passe ici? Est-ce un artefact de la classe le constructeur crée pour gérer yield return (qui est la source du JobRecord)?

Était-ce utile?

La solution

Dans les collections .net et des listes de travail en redimensionnant automatiquement quand ils manquent d'espace. Pour rendre cela efficace, ils ne sont pas redimensionnés pas seulement par 1 à chaque fois supplémentaire, ils courent, ils utilisent un algorithme interne pour redimensionner et laisser un peu d'espace supplémentaire, le but étant qu'ils ne doivent pas redimensionner trop souvent.

Ce que vous voyez ici est la collection étant publié en feuilleton avec tout l'espace supplémentaire étant sérialisé aussi. c'est parce que la sérialisation est le stockage de la collection exactement comme il est, donc quand vous désérialiser vous obtenez le même dos, avec le même nombre d'espace interne gauche.

Si c'est une liste que vous utilisez, vous pouvez vérifier l'espace réservé à l'intérieur en regardant la propriété Capacity.

Si vous voulez supprimer un espace supplémentaire avant sérialisation de la collection que vous pouvez appeler.

myStuff.Capacity = myStuff.Count;

Ceci règlera la capacité disponible pour être le même que le nombre d'éléments contenus, donc il n'y aura pas d'espace réservé.

Malheureusement, si elle est une collection que vous utilisez la capacité est pas disponible, il vous suffit de faire confiance à la collection pour le faire est le redimensionnement interne.

De toute façon, je ne vous inquiétez pas trop à moins que vous devez être vraiment vraiment efficace de l'espace. Si vous le faites, utilisez un tableau de taille fixe à la place.

Autres conseils

Juste une supposition, mais notez le z:Size="4". On dirait quatre entrées de JobRecord pour moi, et je suppose que trois d'entre eux = null.

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