C# 如何使用DataContract正确序列化从集合派生的类
在C和.NET4.5中,我正在通过DataContract序列化实现XML生成/解析,这看起来非常有效。 然而,我在一些情况下遇到了一些问题,我希望有人能帮助我 相关的类包括以下5个类和一些嵌入式对象: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
[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似乎完全符合要求,除了一些特殊之处。