.net 在我的DataContract XML中,这些空集合条目是什么?

.net 在我的DataContract XML中,这些空集合条目是什么?,.net,xml,null,netdatacontractserializer,xml-nil,.net,Xml,Null,Netdatacontractserializer,Xml Nil,有人知道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:n

有人知道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>

工作1
1.
2.
注意三个额外的“JobRecord”条目和一个额外的元素,该元素表示“嘿,我知道这里有四个节点,但其中只有一个表示任何内容。”

这似乎是一种奇怪的行为。好的,我可以看到NDC深入到对象图中,可能正在使用一个大小大于被序列化项目数的后备数组(想想列表的后备数组)


这是怎么回事?它是构造函数为处理
收益返回(JobRecord的源代码)而创建的类的工件吗?

只是猜测,但请注意
z:Size=“4”
。在我看来有四个
JobRecord
条目,我猜其中三个=
null
只是一个猜测,但请注意
z:Size=“4”
。在我看来有四个
JobRecord
条目,我猜其中三个=
null

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

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

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

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

myStuff.Capacity = myStuff.Count;
这会将可用容量设置为与包含的项目数相同,因此没有保留空间

不幸的是,如果您使用的是一个容量不可用的集合,那么您只需信任该集合即可完成它的内部调整


不管怎样,我都不会太担心,除非你真的需要节省空间。如果需要,请改用固定大小的数组。

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

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

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

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

myStuff.Capacity = myStuff.Count;
这会将可用容量设置为与包含的项目数相同,因此没有保留空间

不幸的是,如果您使用的是一个容量不可用的集合,那么您只需信任该集合即可完成它的内部调整


不管怎样,我都不会太担心,除非你真的需要节省空间。如果需要,请使用固定大小的数组。

哇!这正是我在问题中所说的!你的阅读理解能力很好!现在,为什么国家数据中心要这么做?@Will:当你谈到附加元素时,没有意识到你指的是属性。当然,它这样做是为了让你可以反序列化你序列化的内容。哇!这正是我在问题中所说的!你的阅读理解能力很好!现在,为什么国家数据中心要这么做?@Will:当你谈到附加元素时,没有意识到你指的是属性。当然,它这样做是为了让您可以反序列化序列化的内容。我使用编译器放入实现
yield return
的类中的任何内容。我认为它不会包含我的返回类型的数组。这似乎仍然是一种非常奇怪的行为。我认为序列化程序会使枚举器跳闸,获取结果并将其放入适当大小的数组或堆栈中,然后将其发送出去。@Will。你能发布你用来序列化这个的代码吗。我对如何使用yield很感兴趣。我认为真正的答案是,NDC在序列化时会躲在幕后,因此它实际上会触及集合的内部并序列化它们。我使用编译器放入类中实现
yield return
的任何内容。我认为它不会包含我的返回类型的数组。这似乎仍然是一种非常奇怪的行为。我认为序列化程序会使枚举器跳闸,获取结果并将其放入适当大小的数组或堆栈中,然后将其发送出去。@Will。你能发布你用来序列化这个的代码吗。我感兴趣的是你是如何使用收益率的。我认为真正的答案是NDC在序列化时会躲在幕后,因此它实际上会触及集合的内部并序列化它们。你能展示序列化这些的代码吗?您提到了“收益率-收益率”,但不清楚这与此XML有何关系。您能展示序列化此XML的代码吗?您提到了“收益率回报”,但不清楚这与此XML有何关系。