Frage

Weiß jemand, warum die NetDataContractSerializer könnten „Null“ Einträge in einer serialisierten Sammlung hinzufügen?

Beispiel:

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

Beachten Sie die drei extra „JobRecord“ Einträge und das zusätzliche Element zu sagen: „Hey, ich weiß, es gibt vier Knoten hier, aber nur einer von ihnen etwas bedeutet.“

Es scheint wie eine seltsame Verhalten. Okay, so dass ich sehen konnte, dass die NDCS peers tief in das Objektgraph und könnte mit einem Träger Array werden twiddling, die eine Größe hat, die größer ist als die Anzahl der Elemente wird serialisiert (man denke an die Trägeranordnung für eine Liste).

Ist das, was hier vor sich geht? Ist es ein Artefakt der Klasse der Konstruktor Griff yield return erzeugt (die die Quelle des JobRecord ist)?

War es hilfreich?

Lösung

In .net Sammlungen und Listen Arbeit durch automatische Größenanpassung, wenn sie genügend Speicherplatz aus. Um diese effizient zu machen sie nicht einfach von 1 Extra jedes Mal der Größe sie laufen, verwenden sie einen internen Algorithmus, um die Größe und etwas mehr Platz zu lassen, mit dem Ziel, dass sie müssen nicht zu oft ändern.

Was Sie hier sehen, ist die Sammlung mit all den zusätzlichen Platz Wesen serialisiert zu serialisiert. dies liegt daran, dass die Serialisierung die Sammlung genau speichert, wie es ist, so, wenn Sie es deserialisieren Sie das gleiche zurück, mit der gleichen Anzahl von inneren Raum gelassen.

Wenn es eine Liste Sie verwenden Sie, indem man die Capacity Eigenschaft den intern reservierten Raum überprüfen.

Wenn Sie einen zusätzlichen Platz zu entfernen, bevor Sie die Sammlung Serialisierung können Sie anrufen.

myStuff.Capacity = myStuff.Count;

Dies wird die verfügbare Kapazität eingestellt das gleiche wie die Anzahl der Elemente enthalten sein, so wird es kein reservierter Platz sein.

Leider, wenn es eine Sammlung Sie die Kapazität verwenden, ist nicht verfügbar, müssen Sie nur die Sammlung vertrauen, es ist Ändern der Größe intern zu tun.

oder so, ich würde mich keine Sorgen zu viel, wenn Sie wirklich wirklich Raum effizient sein müssen. Wenn Sie das tun, anstatt eine feste Größe Array.

Andere Tipps

Nur eine Vermutung, aber beachten Sie die z:Size="4". Sieht aus wie vier JobRecord Einträge zu mir, und ich denke, drei von ihnen = null.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top