1

在 C# 和 .NET 4.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
  {
  .....
  }

使用 DataContractSerializer(在 CashFlowList 类型上)时,生成的 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 是正确的 - 但有一些怪癖:首先是 <_items> 元素,我猜这些元素是序列化程序管理输出所必需的。其次,您会注意到每个集合 - 在 <_items> 元素中始终至少有 4 个子元素 - 例如,将另一个 CashFlow 添加到外部将导致只有 2 个元素 - 为什么,有没有办法绕过那 ?

用 [CollectionDataContract] 替换一个或多个 [DataContract] 属性 - 无论属性中设置了哪些属性 - 将按预期生成语法正确的 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>  

在上面的示例中,以下元素(在外部 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(CanExport 方法失败),但 XML 正确且完整,但不是特别清晰。

因此,我非常感谢对此的任何见解和/或想法。

最好的问候和感谢,

迈克尔

4

0 回答 0