强制WCF序列化未使用的类

时间:2009-07-20 14:07:38

标签: c# xml wcf

我似乎遇到了以下代码片段的问题,当我来指定项目是什么时(例如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; }
}

非常感谢,西蒙!

3 个答案:

答案 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方法?