有谁知道为什么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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top