1

有谁知道为什么 NetDataContractSerializer 可能会在序列化集合中添加“nil”条目?

例如,

  <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 的来源)吗?

4

2 回答 2

1

在 .net 中,集合和列表在空间不足时通过自动调整大小来工作。为了提高效率,他们不只是在每次用完时额外调整大小,他们使用内部算法来调整大小并留下一些额外的空间,目的是他们不必经常调整大小。

您在这里看到的是正在序列化的集合,所有额外的空间也被序列化。这是因为序列化完全按原样存储集合,所以当你反序列化它时,你会得到相同的结果,并留下相同数量的内部空间。

如果它是您正在使用的列表,您可以通过查看Capacity属性来检查内部保留空间。

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

myStuff.Capacity = myStuff.Count;

这会将可用容量设置为与包含的项目数相同,因此不会有保留空间。

不幸的是,如果它是您正在使用的集合,容量不可用,您只需要信任该集合即可在内部调整大小。

无论哪种方式,除非您需要真正真正节省空间,否则我不会太担心它。如果这样做,请改用固定大小的数组。

于 2010-03-23T17:14:08.267 回答
0

只是猜测,但请注意z:Size="4". 对我来说看起来像四个JobRecord条目,我猜其中三个 = null

于 2010-03-23T16:55:07.527 回答