什么都在我的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>
注意三个额外的“JobRecord”条目和附加元素说:“哎,我知道有四个节点在这里,但其中只有一个是指什么。”
这似乎是一个奇怪的行为。好了,所以我可以看到NDCS深深射进对象图,并可能与具有尺寸大于正在连载的项目数的支持数组来摆弄(想支持数组的列表)。
是什么回事?是它的构造器创建类来处理yield return
的人为现象(这是JobRecord的来源)?
解决方案
在.NET中的集合,并列出工作通过自动调整,当他们运行的空间了。为了使这个高效的,他们不只是由1次额外,他们跑出来,每次调整,他们用一个内部算法来调整,并留下一些额外的空间,其目的是,他们不必过于频繁地调整。
你所看到的是正在连载的所有连载过的额外空间存在的集合。这是因为序列化存储准确收集,因为它是,所以当你反序列化它,你会得到相同的背面,与相同数量的离开内部空间。
如果这是你使用,你可以通过查看Capacity
属性检查内部预留空间的List。
如果您希望您序列集合之前删除任何额外的空间,你可以调用。
myStuff.Capacity = myStuff.Count;
这将设置的可用容量是作为项目的数量包含的,所以不会有预留空间是相同的。
不幸的是,如果它是你正在使用的容量的集合不可用,你只需要坚信集合做它的内部调整。
无论哪种方式,我不会,除非你需要真的很节省空间的担心太多。如果这样做,使用固定大小的数组代替。
其他提示
只是一个猜测,但要注意的z:Size="4"
。看起来样四个JobRecord
条目给我,我想他们三个= null
。
不隶属于 StackOverflow