DataContract XML中的所有这些空集合条目是什么?
有谁知道为什么NetDataContractSerializer可能在序列化集合中添加“nil”条目?DataContract XML中的所有这些空集合条目是什么?
例如,
<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与对象图深入对等,并且可能会与后面的数组混在一起,该数组的大小大于要序列化的项的数量(请考虑List的后备数组)。
这是怎么回事?它是构造函数创建用于处理yield return
(这是JobRecord的源代码)的类的人工产物吗?
.net集合和列表在空间不足时通过自动调整大小来工作。为了达到这个效果,他们不会每次额外增加1次额外的大小,他们使用内部算法来调整大小并留下一些额外的空间,目的是不必经常调整大小。
你所看到的是正在连载的所有多余的空间正在连载过的集合。这是因为序列化完全按照原样存储集合,所以当你反序列化它时,你会得到相同的回来,剩下相同数量的内部空间。
如果它是你使用,你可以通过查看Capacity
属性检查内部预留空间列表。
如果你想你序列化,你可以调用集合之前删除任何额外的空间。
myStuff.Capacity = myStuff.Count;
这将设置的可用容量是所包含的项目数是相同的,所以不会有预留空间。
不幸的是,如果它是你正在使用的容量的集合不可用,你只需要坚信集合做它的内部调整。
无论哪种方式,除非你需要真的很节省空间,我不会担心太多。如果是这样,请改为使用固定大小的数组。
只是一个猜测,但要注意的z:Size="4"
。看起来像四个JobRecord
条目给我,我猜他们三个= null
。
哇!这正是我在问题中所说的!你的阅读理解很好!现在,*为什么NDCS会这样做?* – Will 2010-03-23 18:55:25
@Will:当你谈到附加元素时,没有意识到你的意思。它是这样做的,所以你可以反序列化你序列化的东西,当然。 – 2010-03-23 19:05:22
你能展示序列化这个代码吗?您提到“收益回报”,但不清楚这与XML有何关系。 – 2010-03-23 19:06:25