使用 RestSharp 序列化具有一个值的对象集合

Serialize collection of objects with one value using RestSharp

我需要下一个xml数据:

<trackingrequest>
    <user>USERNAME</user>
    <password>PASSWORD</password>
    <trackingnumbers>
        <trackingnumber>12345678901</trackingnumber>
    </trackingnumbers>
</trackingrequest>

为此,我创建了下一个模型:

[SerializeAs(Name = "trackingrequest")]
public class DpdTrackingRequest
{
    [SerializeAs(Name = "user")]
    public string User { get; set; }

    [SerializeAs(Name = "password")]
    public string Password { get; set; }

    [SerializeAs(Name = "trackingnumbers")]
    [XmlArrayItem("trackingnumber")]
    public IList<DpdTrackingNumber> TrackingNumbers { get; set; }
}

public class DpdTrackingNumber
{
    public string Value { get; set; }
}

但是当我调用 AddXmlBody 方法时,我看到了下一个结果:

<trackingrequest>
    <user>USERNAME</user>
    <password>PASSWORD</password>
    <trackingnumbers>
        <DpdTrackingNumber>
            <Value>12345678901</Value>
        </DpdTrackingNumber>
    </trackingnumbers>
</trackingrequest>

如何在 <trackingnumber>12345678901</trackingnumber> 中合并 <DpdTrackingNumber><Value>12345678901</Value></DpdTrackingNumber>

为了达到您的要求,我认为您必须将 System.Xml.Serialization.XmlTextAttribute 设置为 DpdTrackingNumber.Value 属性。

但是,RestRequestXmlSerializer 默认为 RestSharp.Serializers.XmlSerializer,它无法读取 System.Xml.Serialization 属性。
因此,您必须在调用 AddXmlBody 方法之前将 XmlSerializer 重置为 RestSharp.Serializers.DotNetXmlSerializer

dpdTrackingRequest.TrackingNumbers = new List<DpdTrackingNumber>();
dpdTrackingRequest.TrackingNumbers.Add(new DpdTrackingNumber { Value = "12345678901" });

RestRequest restRequest = new RestRequest();
// reset XmlSerializer
restRequest.XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer();
var result = restRequest.AddXmlBody(dpdTrackingRequest);

此外,您可能必须将 TrackingNumbers 的类型从 IList 更改为 List,因为 DotNetXmlSerializer 无法序列化接口,因此 DpdTrackingRequest class如下:

using System.Xml.Serialization;

//was [SerializeAs(Name = "trackingrequest")]
[XmlRoot("trackingrequest")]
public class DpdTrackingRequest
{
    //was [SerializeAs(Name = "user")]
    [XmlElement("user")]
    public string User { get; set; }

    //was [SerializeAs(Name = "password")]
    [XmlElement("password")]
    public string Password { get; set; }

    //was [SerializeAs(Name = "trackingnumbers")]
    //from IList to List
    [XmlArray("trackingnumbers")]
    [XmlArrayItem("trackingnumber")]
    public List<DpdTrackingNumber> TrackingNumbers { get; set; }
}

public class DpdTrackingNumber
{
    [XmlText]
    public string Value { get; set; }
}