C# 如何使用DataContract正确序列化从集合派生的类

C# 如何使用DataContract正确序列化从集合派生的类,c#,.net,serialization,datacontractserializer,xmlserializer,C#,.net,Serialization,Datacontractserializer,Xmlserializer,在C和.NET4.5中,我正在通过DataContract序列化实现XML生成/解析,这看起来非常有效。 然而,我在一些情况下遇到了一些问题,我希望有人能帮助我 相关的类包括以下5个类和一些嵌入式对象: [DataContract] public abstract class ItemList<T> : List<T>, IList { ..... } [DataContract] public class CashFlowList : ItemList&l

在C和.NET4.5中,我正在通过DataContract序列化实现XML生成/解析,这看起来非常有效。 然而,我在一些情况下遇到了一些问题,我希望有人能帮助我

相关的类包括以下5个类和一些嵌入式对象:

[DataContract]
public abstract class ItemList<T> : List<T>, IList
  {
  .....
  }

[DataContract]
public class CashFlowList : ItemList<CashFlow>
  {
  .....
  }

[DataContract]
public class CashFlow : ItemList<CashFlowPayment>  
  {
  .....
  }

[DataContract]
public class CashFlowPayment : ListItem, IDataImportExport
  {
  .....
  }

[DataContract]
public abstract class ListItem : System.IComparable, IList
  {
  .....
  }
在CashFlowList类型上使用DataContractSerializer时,生成的XML如下所示:

<CashFlowList xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/FinancialData">
  <_items>
    <CashFlow>
      <_items>
        <CashFlowPayment>
          <ID>-1</ID>
          <ProbDist xmlns:d6p1="http://schemas.datacontract.org/2004/07/ProbabilityDistributions" i:nil="true" />
          <UseProbabilityDistribution>true</UseProbabilityDistribution>
          <ValidFrom>0001-01-01T00:00:00</ValidFrom>
          <ValidThrough>9999-12-31T23:59:59.9999999</ValidThrough>
          <Amount>4500</Amount>
          <Ccy i:nil="true" />
          <Date>2012-02-03T00:00:00</Date>
          <DaysFromStartDate>-1</DaysFromStartDate>
        </CashFlowPayment>
        <CashFlowPayment>
          <ID>-1</ID>
          <ProbDist xmlns:d6p1="http://schemas.datacontract.org/2004/07/ProbabilityDistributions" i:nil="true" />
          <UseProbabilityDistribution>true</UseProbabilityDistribution>
          <ValidFrom>0001-01-01T00:00:00</ValidFrom>
          <ValidThrough>9999-12-31T23:59:59.9999999</ValidThrough>
          <Amount>-30000</Amount>
          <Ccy i:nil="true" />
          <Date>2013-04-10T00:00:00+02:00</Date>
          <DaysFromStartDate>465</DaysFromStartDate>
          <DaysUntilEndDate>-1</DaysUntilEndDate>
          <IsPerpetual>false</IsPerpetual>
          <PaymentType>Unknown</PaymentType>
          <Schedule xmlns:d6p1="http://schemas.datacontract.org/2004/07/Schedules" i:nil="true" />
        </CashFlowPayment>
        <CashFlowPayment i:nil="true" />
        <CashFlowPayment i:nil="true" />
      </_items>
      <_size>2</_size>
      <_version>3</_version>
      <ID>-1</ID>
      <Name></Name>
      <ProbDist xmlns:d4p1="http://schemas.datacontract.org/2004/07/ProbabilityDistributions" i:nil="true" />
      <UseProbability>false</UseProbability>
      <ValidFrom>0001-01-01T00:00:00</ValidFrom>
      <ValidThrough>9999-12-31T23:59:59.9999999</ValidThrough>
      <BaseCCY></BaseCCY>

 ..............................

       <StartDate>2012-05-09T00:00:00</StartDate>
      <SumOfNegativePayments>-30000</SumOfNegativePayments>
      <SumOfPositivePayments>4500</SumOfPositivePayments>
      <ValueDate>0001-01-01T00:00:00</ValueDate>
      <XMLCashFlowElementName i:nil="true" />
      <XMLPaymentElementName i:nil="true" />
      <XMLPaymentsElementName i:nil="true" />
    </CashFlow>
    <CashFlow i:nil="true" />
    <CashFlow i:nil="true" />
    <CashFlow i:nil="true" />
  </_items>
  <_size>1</_size>
  <_version>1</_version>
  <ID>-1</ID>
  <Name></Name>
  <ProbDist xmlns:d2p1="http://schemas.datacontract.org/2004/07/ProbabilityDistributions" i:nil="true" />
  <UseProbability>false</UseProbability>
  <ValidFrom>0001-01-01T00:00:00</ValidFrom>
  <ValidThrough>9999-12-31T23:59:59.9999999</ValidThrough>
</CashFlowList>
生成的XML是正确的,但有一些怪癖:首先,我想序列化程序需要这些元素来管理输出。 其次,您会注意到,每个集合(在元素中)都至少有4个子元素,例如,向集合中添加另一个现金流 外部将导致只有2个元素-为什么,有没有办法绕过这一点

将一个或多个[DataContract]属性替换为[CollectionDataContract]——无论属性中设置了什么属性——都将产生 按照预期语法正确的XML输出,但是现在-对于每个具有[CollectionDataContract]属性的类-只输出集合项-而不是常规项 类中的属性。例如:

<CashFlowList xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/FinancialData">
  <CashFlow>
    <CashFlowPayment>
    ....
    </CashFlowPayment>      
  </CashFlow>    
</CashFlowList>  
在上面的示例中,外部现金流列表对象中的以下元素已被忽略:

  <ID>-1</ID>
  <Name></Name>
  <ProbDist xmlns:d2p1="http://schemas.datacontract.org/2004/07/ProbabilityDistributions" i:nil="true" />
  <UseProbability>false</UseProbability>
  <ValidFrom>0001-01-01T00:00:00</ValidFrom>
  <ValidThrough>9999-12-31T23:59:59.9999999</ValidThrough>
所以我的问题是,这是否是出于设计,并且是不可避免的,也就是说,您能否输出从集合派生的类,并在输出中包含其他属性 当使用[CollectionDataContract]属性时

有趣的是,如果使用了[CollectionDataContract]属性,则可以使用XsdDataContractExporter类生成/检索相应的XSD,而无需 除了由于缺少属性而导致XML不完整之外,还有其他问题。但是,在使用[DataContract]属性时,如果发生故障,则无法生成XSD 方法,但XML是正确和完整的,但不是特别清晰

因此,我非常感谢您对此提出任何见解和/或想法

致以最良好的问候和感谢


Michael

您尝试过XmlSerializer或LinqToXml吗?@I4V:我考虑过XmlSerializer,但这会带来问题,因为不支持非公共设置器,这不是一个选项。LinqToXML当然可以使用,但DataContractSerialization似乎完全符合要求,除了一些特殊之处。