Domanda

Qualcuno sa il motivo per cui il NetDataContractSerializer potrebbe aggiungere "nil" Voci in una collezione serializzato?

Ad esempio,

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

Notare le tre voci extra "JobRecord" e l'ulteriore elemento dicendo "ehi, so che ci sono quattro nodi qui, ma solo uno di loro significa nulla".

Sembra un comportamento strano. Ok, così ho potuto vedere che i pari NDC profondamente nel grafo di oggetti e potrebbe essere twiddling con una matrice di supporto che ha una dimensione che è maggiore del numero di elementi che viene serializzato (si pensi alla matrice di supporto per una lista).

E 'questo che sta succedendo qui? E 'un artefatto della classe del costruttore crea per gestire yield return (che è la fonte del JobRecord)?

È stato utile?

Soluzione

In collezioni .net e gli elenchi di lavoro da ridimensionamento automatico quando si esaurisce lo spazio. Per rendere questo efficace non si limitano a ridimensionare da 1 in più ogni volta che si esauriscano, usano un algoritmo interno per ridimensionare e lasciare qualche spazio in più, l'obiettivo è che essi non devono ridimensionare troppo spesso.

Quello che state vedendo qui è la collezione viene serializzato con tutto lo spazio extra viene serializzato troppo. questo è perché la serializzazione è la conservazione della collezione esattamente così com'è, in modo che quando si deserializzare esso si ottiene la stessa schiena, con lo stesso numero di spazio interno a sinistra.

Se si tratta di un elenco che si sta utilizzando è possibile controllare lo spazio riservato internamente, cercando in proprietà Capacity.

Se si desidera rimuovere qualsiasi spazio in più prima di serializzare la collezione si può chiamare.

myStuff.Capacity = myStuff.Count;

In questo modo impostare la capacità disponibile per essere lo stesso il numero di elementi contenuti, quindi non ci sarà spazio riservato.

Purtroppo, se si tratta di una collezione che si sta utilizzando la capacità non è disponibile, è solo bisogno di fiducia della collezione per farlo è il ridimensionamento internamente.

In ogni caso, io non mi preoccuperei troppo a meno che non avete bisogno di essere davvero efficiente dello spazio. Se lo fai, utilizzare un array di dimensioni fisse.

Altri suggerimenti

Solo una supposizione, ma nota la z:Size="4". Assomiglia a quattro voci JobRecord a me, e credo che tre di loro = null.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top