C# XMLSerialization变量

C# XMLSerialization变量,c#,xml-serialization,C#,Xml Serialization,我有一个名为DocInvoicing的对象,代表一张发票,该对象有两个相关纳税人,一个是发卡纳税人,另一个是收款纳税人。每个纳税人基本上都是同一个对象,每个纳税人有一个billto地址和一个shipto地址列表,但当我将其序列化为XML时,我希望得到下一个结构 <DocInvoicing> <IssuerTaxPayer> <BuyingContact /> <AlternatePartyId /> <Alternat

我有一个名为DocInvoicing的对象,代表一张发票,该对象有两个相关纳税人,一个是发卡纳税人,另一个是收款纳税人。每个纳税人基本上都是同一个对象,每个纳税人有一个billto地址和一个shipto地址列表,但当我将其序列化为XML时,我希望得到下一个结构

<DocInvoicing>
<IssuerTaxPayer>
    <BuyingContact />
    <AlternatePartyId />
    <AlternatePartyType>DEFAULT</AlternatePartyType>
    <Gln />
    <CorreoElectronico />
    <RegimenFiscal />
    <IdIssuerTaxPayer>0</IdIssuerTaxPayer>
    <IdTaxPayer>1</IdTaxPayer>
    <DocType>CFDI</DocType>
    <TaxPayerType />
    <Rfc>ALR090701B53</Rfc>
    <Name>ASTILLA LOPEZ  Y RIVERA CONSULTORES  S.A. DE C.V.</Name>
    <BillingAddressIssuer>
        <Gln />
        <IdAddress>1</IdAddress>
        <Street>VALLE DE LAS JACARANDAS</Street>
        <ExternalNumber>25</ExternalNumber>
        <InternalNumber />
        <Block>IZCALLI DEL VALLE</Block>
        <Localidad />
        <Reference />
        <Municipio>TULTITLAN</Municipio>
        <State>ESTADO DE MEXICO</State>
        <Country>MEXICO</Country>
        <ZipCode>54945</ZipCode>
    </BillingAddressIssuer>
    <ShipmentAddressIssuer>
        <Gln />
        <IdAddress>2</IdAddress>
        <Street>CARRETERA LAGO DE GUADALUPE</Street>
        <ExternalNumber>KM 3.5</ExternalNumber>
        <InternalNumber />
        <Block>LAGO DE GUADALUPE</Block>
        <Localidad />
        <Reference>TEC DE MONTERREY 6to PISO SALA 3</Reference>
        <Municipio>ATIZAPAN</Municipio>
        <State>ESTADO DE MEXICO</State>
        <Country>MEXICO</Country>
        <ZipCode>52926</ZipCode>
    </ShipmentAddressIssuer>
</IssuerTaxPayer>
<ReceiverTaxPayer>
    <BuyingContact />
    <AlternatePartyId />
    <AlternatePartyType>DEFAULT</AlternatePartyType>
    <Gln />
    <CorreoElectronico />
    <RegimenFiscal />
    <IdIssuerTaxPayer>1</IdIssuerTaxPayer>
    <IdTaxPayer>1205</IdTaxPayer>
    <DocType>ND</DocType>
    <TaxPayerType>R</TaxPayerType>
    <Rfc>XAXX010101000</Rfc>
    <Name>PUBLICO EN GENERAL</Name>
    <BillingAddressReceiver>
        <Gln />
        <IdAddress>1217</IdAddress>
        <Street>MARGARITA MAZA</Street>
        <ExternalNumber />
        <InternalNumber />
        <Block />
        <Localidad />
        <Reference />
        <Municipio />
        <State />
        <Country>MEXICO</Country>
        <ZipCode />
    </BillingAddressReceiver>
    <ShipmentAddressReceiver>
        <Gln />
        <IdAddress>0</IdAddress>
        <Street />
        <ExternalNumber />
        <InternalNumber />
        <Block />
        <Localidad />
        <Reference />
        <Municipio />
        <State />
        <Country />
        <ZipCode />
    </ShipmentAddressReceiver>
</ReceiverTaxPayer>
</DocInvoicing>
类ReTaxPayer:

public class ReTaxPayer : TaxPayer
{
    public Address BillingAddressReceiver
    {
        get { return this.BillingAddress; }
        set { this.BillingAddress = value; }
    }


    public Address ShipmentAddressReceiver
    {
        get { return this.ShipmentAddresses[0]; }
        set { this.ShipmentAddresses[0] = value; }
    }

}
并将其添加到对象DocInvoicing(表示发票)上

我不喜欢这个解决方案,因为我们有两个不同的扩展对象,只是用这些名称对它们进行序列化

我想知道是否有任何方法可以避免创建这两个扩展类,它们只包含相同的对象,但名称不同(如果不能只包含一个地址,那么使用一个数组而不是一个地址并不是什么大问题),我知道您可以直接修改定义上方声明的元素名称或属性,但我必须根据属性修改节点和元素,这又如何呢


感谢您的宝贵帮助

您是否尝试使用同一类别的两个属性:公共纳税人IssuerTaxPayer{get;set;}和公共纳税人ReceiverTaxPayer{get;set;}?是的,但地址名称应不同:IssuerTaxPayer/BillingAddressIssuer,IssuerTaxPayer/ShipmentAddressIssuer,ReceiverTaxPayer/BillingAddressReceiver,ReceiverTaxPayer/ShipmentAddressReceiverYes,但每个xml元素的名称都是属性名称:IssuerTaxPayer和Receiver…是的,这没关系,但地址对象对两者都是一样的,问题是我需要纳税人对象上的地址的不同名称对我来说似乎是多余的。。。但好吧,假设您真的需要它,那么您的IssuerTaxPayer和ReceiverTaxPayer是不同的元素,需要不同的类来定义它的序列化
public class IsTaxPayer : TaxPayer
{
    public Address BillingAddressIssuer
    {
        get { return this.BillingAddress; }
        set { this.BillingAddress = value; }
    }

    public Address ShipmentAddressIssuer
    {

        get { return this.ShipmentAddresses[0]; }
        set { this.ShipmentAddresses[0] = value; }
    }
}
public class ReTaxPayer : TaxPayer
{
    public Address BillingAddressReceiver
    {
        get { return this.BillingAddress; }
        set { this.BillingAddress = value; }
    }


    public Address ShipmentAddressReceiver
    {
        get { return this.ShipmentAddresses[0]; }
        set { this.ShipmentAddresses[0] = value; }
    }

}
[XmlRoot("DocInvoicing")]
public class DocInvoices : DocObj
{
    private IsTaxPayer issuerTaxPayer = new IsTaxPayer();

    public IsTaxPayer IssuerTaxPayer
    {
        get
        {
            return this.issuerTaxPayer;
        }
        set
        {
            this.issuerTaxPayer = value;
        }
    }

    private ReTaxPayer receiverTaxPayer = new ReTaxPayer();

    public ReTaxPayer ReceiverTaxPayer
    {
        get
        {
            return this.receiverTaxPayer;
        }
        set
        {
            this.receiverTaxPayer = value;
        }
    }

}