2010-03-23 26 views
1

有誰知道爲什麼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

回答

1

.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

0

只是一個猜測,但要注意的z:Size="4"。看起來像四個JobRecord條目給我,我猜他們三個= null

+0

哇!這正是我在問題中所說的!你的閱讀理解很好!現在,*爲什麼NDCS會這樣做?* – Will 2010-03-23 18:55:25

+0

@Will:當你談到附加元素時,沒有意識到你的意思。它是這樣做的,所以你可以反序列化你序列化的東西,當然。 – 2010-03-23 19:05:22

相關問題