2017-08-02 241 views
0

我有我想添加额外属性的WSDL服务类。当我试图反序列化我的派生类时,它给出错误“您需要将XmlChoiceIdentifierAttribute添加到'ObjCreatePaperClipTransaction'成员。”使用XmlChoiceIdentifierAttribute序列化派生类成员

这是我在服务类上写的代码。 (executeCreatePaperClipTransaction & CreatePaperClipTransactionType是从代理对象类)

namespace MyProject.DTO 
{ 
    [XmlType("executeCreatePaperClipTransaction")] 
    public partial class CustomExecuteCreatePaperClipTransaction : executeCreatePaperClipTransaction 
    { 
     [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)] 
     [XmlElement("CreatePaperClipTransaction")] 
     public CustomCreatePaperClipTransactionType ObjCreatePaperClipTransaction { get; set; }   
    }  

    public partial class CustomCreatePaperClipTransactionType : CreatePaperClipTransactionType 
    { 
     [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)] 
     public executeCreateLoanIncrease ObjLoanIncreaseRequest { get; set; } 

     [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 1)] 
     public executeCreateFreeFormEventFeePayment ObjFreeFormEventFeePaymentRequest { get; set; } 
     } 
    } 

当我删除[XmlElement("CreatePaperClipTransaction")]线,其工作的罚款。但在seralized XML我想标签名称是CreatePaperClipTransaction而不是ObjCreatePaperClipTransaction

我通过这个答案去了,但我不知道我怎么能在我的情况下实现https://stackoverflow.com/a/20379038/1169180

+0

为什么你有两个'[XmlElement]'属性附加到'ObjCreatePaperClipTransaction'属性?你的问题是XML中可能有两个不同的元素名称,即和'',并且你想将它们绑定到ObjCreatePaperClipTransaction属性?此外,由于缺少基本类型,您的代码无法编译。你可以添加它们以及要反序列化的XML样本,因此将你的问题扩展到[mcve]? – dbc

回答

0

而不是增加两个独立[XmlElement]属性您ObjCreatePaperClipTransaction财产,你应该添加一个单独的属性与所有必要的信息:

[XmlType("executeCreatePaperClipTransaction")] 
public partial class CustomExecuteCreatePaperClipTransaction : executeCreatePaperClipTransaction 
{ 
    [XmlElement(ElementName = "CreatePaperClipTransaction", Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)] 
    public CustomCreatePaperClipTransactionType ObjCreatePaperClipTransaction { get; set; }   
}  

工作.Net fiddle

当您添加多个[XmlElement]属性的属性,你通知XmlSerializer多个不同的XML元素名称应绑定到相同的属性,例如由于属性值是多态的:

public class BaseClass 
{ 
} 

public class DerivedClass : BaseClass 
{ 
} 

public class RootObject 
{ 
    [XmlElement(ElementName = "BaseClassProperty", Type = typeof(BaseClass))] 
    [XmlElement(ElementName = "DerivedClassProperty", Type = typeof(DerivedClass))] 
    public BaseClass Property { get; set; } 
} 

在上面的例子中,如果Property被分配一个DerivedClass值,下面的XML将被生成:

<RootObject> 
    <DerivedClassProperty /> 
</RootObject> 

这似乎并不适用于此。您只想将您的属性绑定到XML元素名称<CreatePaperClipTransaction>