我似乎遇到了以下代码片段的问题,当我来指定项目是什么时(例如CashInHand),实际类型CashInHandPayment不可用,因为当我没有传输时生成代理类(很可能是因为它没有在XmlElementAttributes中读取)。
有没有办法强制在代理类中序列化AccountPayment,CashInHandPayment和CCPayment等类?
[DataContract]
public class Payment
{
[XmlElementAttribute("Account", typeof(AccountPayment))]
[XmlElementAttribute("CashInHand", typeof(CashInHandPayment))]
[XmlElementAttribute("CreditCard", typeof(CCPayment))]
[XmlChoiceIdentifierAttribute("ItemElementName")]
[DataMember]
public object Item { get; set; }
}
[DataContract]
public enum ItemElementName
{
[EnumMember]
Account,
[EnumMember]
CashInHand,
[EnumMember]
CreditCard
}
//This class will not be in the generated proxy class
[DataContract]
public class AccountPayment
{
[DataMember]
public double Amount { get; set; }
}
//classes for CashInHandPayment and CCPayment also created, but not shown.
请原谅我,如果'序列化'不是正确使用的术语,如果您阅读并发现它不是,请相应更改!
更新 - Simon Svensson提到的答案:
[KnownType(typeof(AccountPayment))]
[KnownType(typeof(CashInHandPayment))]
[KnownType(typeof(CCPayment))]
[DataContract]
public class Payment
{
[XmlElementAttribute("Account", typeof(AccountPayment))]
[XmlElementAttribute("CashInHand", typeof(CashInHandPayment))]
[XmlElementAttribute("CreditCard", typeof(CCPayment))]
[XmlChoiceIdentifierAttribute("ItemElementName")]
[DataMember]
public object Item { get; set; }
}
非常感谢,西蒙!
答案 0 :(得分:4)
嗯。 Isnt XmlElementAttribute和XmlChoiceIdentifierAttribute xml序列化,与DataContractSerializer相比,它是一个较旧的序列化,它读取DataContractAttribute和DataMemberAttribute?
我相信您应该使用KnownTypeAttribute,但我从未尝试过,也没有在我自己的代码中使用过这个场景。
答案 1 :(得分:0)
有没有办法强制像AccountPayment这样的课程, CashInHandPayment和CCPayment将在代理类中序列化?
他们需要使用[DataContract]
属性进行标记,我认为这应该足够了。
svcutil.exe
(直接从命令行启动,或者使用Add Service Reference
从Visual Studio启动)遇到类中包含[DataContract]
属性的类和[DataMember]
上的类属性(或字段),它将在代理中为这些类创建一个副本。
马克
答案 2 :(得分:0)
我认为指定DataContract应该足够了。但是,如果这不起作用,为什么不尝试创建一个使用类的虚拟OperationContract方法?