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的源代码)的类的人工产物吗?

+1

你能展示序列化这个代码吗?您提到“收益回报”,但不清楚这与XML有何关系。 – 2010-03-23 19:06:25

.net集合和列表在空间不足时通过自动调整大小来工作。为了达到这个效果,他们不会每次额外增加1次额外的大小,他们使用内部算法来调整大小并留下一些额外的空间,目的是不必经常调整大小。

你所看到的是正在连载的所有多余的空间正在连载过的集合。这是因为序列化完全按照原样存储集合,所以当你反序列化它时,你会得到相同的回来,剩下相同数量的内部空间。

如果它是你使用,你可以通过查看Capacity属性检查内部预留空间列表。

如果你想你序列化,你可以调用集合之前删除任何额外的空间。

myStuff.Capacity = myStuff.Count; 

这将设置的可用容量是所包含的项目数是相同的,所以不会有预留空间。

不幸的是,如果它是你正在使用的容量的集合不可用,你只需要坚信集合做它的内部调整。

无论哪种方式,除非你需要真的很节省空间,我不会担心太多。如果是这样,请改为使用固定大小的数组。

+0

我使用任何编译器放入实现'yield return'的类。我不认为它会包含我的返回类型的数组。它似乎仍然是一个非常奇怪的行为。我想串行器会跳过枚举器,获取结果并将其粘贴到适当大小的数组或堆栈中,然后将其发送到导线上。 – Will 2010-03-23 18:59:38

+0

@会。你可以发布你正在使用的代码串行化这个。我对你如何使用收益感兴趣。 – 2010-03-23 19:48:54

+0

我认为真正的答案是NDCS在序列化时会在窗帘后面偷看,所以它实际上击中了集合的内部并将它们序列化。 – Will 2010-06-16 13:43:29

只是一个猜测,但要注意的z:Size="4"。看起来像四个JobRecord条目给我,我猜他们三个= null

+0

哇!这正是我在问题中所说的!你的阅读理解很好!现在,*为什么NDCS会这样做?* – Will 2010-03-23 18:55:25

+0

@Will:当你谈到附加元素时,没有意识到你的意思。它是这样做的,所以你可以反序列化你序列化的东西,当然。 – 2010-03-23 19:05:22