私のDataContractのXML内のすべてのこれらのヌル・コレクション・エントリは何ですか?
-
21-09-2019 - |
質問
NetDataContractSerializerは、シリアル化されたコレクションで「ゼロ」のエントリが追加される場合がありますなぜの誰でも知っていますか?
たとえば、
<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>
お知らせ3余分な「JobRecord」エントリと追加要素「ねえ、私は4つのノードがここにあります知っているが、それらの一方のみが何を意味します。」
と言ってこれは奇妙な行動のように思えます。さて、私はNDCSは、オブジェクトグラフに深くピアと(リストのための補助配列を考える)連載されている項目の数より大きいサイズを持つ補助配列をいじるかもしれないことを見ることができたので。
ここで何が起こっていることはありますか?それは(JobRecordの源である)コンストラクタはyield return
を処理するために作成したクラスのアーティファクト?
解決
は、サイズ変更、自動で動作します。これは効率的にするために、彼らはちょうど余分な1によって彼らが実行するたびにサイズを変更していない、彼らは目的は、彼らはあまりにも多くの場合、サイズを変更する必要はありませんということで、いくつかの余分なスペースのサイズを変更して残すために内部アルゴリズムを使用します。
あなたがここで見ていることはあまりにも連載されている余分なスペースのすべてに連載されているコレクションです。そのままシリアライズが残され、内部空間の数が同じで、あなたはそれをデシリアライズするときので、あなたが同じバックを取得し、正確にコレクションを記憶しているためである。
それはリストだ場合は、あなたはCapacity
プロパティを調べることで、内部で予約された領域を確認することができます使用しています。
あなたは、コレクションをシリアル化する前に余分なスペースを削除したい場合は、呼び出すことができます。
myStuff.Capacity = myStuff.Count;
これはアイテムの数が含まれるように空き容量が同じになるように設定されますので、予約済みスペースがないであろう。
残念ながら、それはあなたが能力を使用しているコレクションが利用できないなら、あなたはそれが内部的にリサイズいます。
行うためにコレクションを信頼する必要があります あなたが本当にスペース効率的である必要がない限り、いずれにせよ、私はあまりそれについて心配しないでしょう。そうした場合、代わりに固定サイズの配列を使用します。
他のヒント
ただの推測ではなく、z:Size="4"
に注意してください。私には4つのJobRecord
エントリのように見えるが、私はそれらの3がnull
を=と思います。