Pregunta

¿Alguien sabe por qué el NetDataContractSerializer podría agregar entradas "no procede" en una colección seriada?

Por ejemplo,

  <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>

Aviso de las tres entradas adicionales "JobRecord" y el elemento adicional diciendo "bueno, sé que hay cuatro nodos aquí, pero sólo uno de ellos significa nada."

Parece un comportamiento extraño. De acuerdo, por lo que podía ver que los PAD se asoma profundamente en el gráfico de objetos y podría ser twiddling con una matriz de soporte que tiene un tamaño que es mayor que el número de elementos que se serializado (pensar en la matriz de soporte para una lista).

¿Es eso lo que está pasando aquí? Es un artefacto de la clase crea el constructor para yield return mango (que es la fuente de la JobRecord)?

¿Fue útil?

Solución

En las colecciones .net y listas de trabajo por auto cambio de tamaño cuando se les acaba el espacio. Para que esto sea eficaz que no sólo cambian de tamaño en un 1 adicional cada vez que se agoten, que utilizan un algoritmo interno para cambiar el tamaño y dejar un poco de espacio adicional, con el objetivo de que no tienen que cambiar el tamaño demasiado a menudo.

Lo que está viendo aquí es la colección por entregas con todo el ser serializado espacio adicional también. esto se debe a la serialización es el almacenamiento de la colección tal y como es, por lo que al deserializar que se obtiene la misma vuelta, con el mismo número de espacios interna izquierda.

Si se trata de una lista que está utilizando se puede comprobar el espacio reservado internamente examinado la propiedad Capacity.

Si desea eliminar cualquier espacio extra antes de serializar la colección se puede llamar.

myStuff.Capacity = myStuff.Count;

Esto establece la capacidad disponible para ser el mismo que el número de artículos que contiene, por lo que no habrá espacio reservado.

Por desgracia, si se trata de una colección que está utilizando la capacidad no está disponible, sólo tiene que confiar en la colección de hacerlo es cambiar el tamaño interno.

De cualquier manera, yo no me preocuparía demasiado a menos que necesite ser realmente muy eficiente del espacio. Si lo hace, utilice una matriz de tamaño fijo en su lugar.

Otros consejos

Sólo una conjetura, pero tenga en cuenta la z:Size="4". Se parece a cuatro entradas JobRecord a mí, y supongo que tres de ellos = null.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top