在使用RestSharp发布数据时序列化对象

本文关键字:数据 序列化 对象 RestSharp 布数据 | 更新日期: 2023-09-27 18:02:29

我最近开始使用RestSharp来消费一个使用XML的REST服务。

它使得从XML到自定义对象集合的反序列化变得非常简单。但我的问题是,当发送回服务时,重新序列化的最佳方法是什么?

我应该使用LINQ-to-XML重新序列化吗?我尝试使用Serializeable属性和SerializeToXml实用函数,但是当我这样做时,它似乎打破了RestSharp执行的反序列化。

在使用RestSharp发布数据时序列化对象

虽然我的情况相对简单,但我已经能够使用属性来获得我需要的所有内容。例如,为了让它反序列化带有破折号的节点,然后能够序列化到相同的节点名称,我使用了以下命令:

[XmlElement(ElementName = "short-name")]
[SerializeAs(Name = "short-name")]
public string shortName { get; set; }

因此,在您的示例中,序列化不尊重[XmlElement("elementName")]。相反,您需要使用[SerializeAs(Name = "elementName")]

我通过浏览RestSharp项目中的测试代码发现了这一点。

在查看RestSharp的源代码后,我发现他们实际上有一个名为DotNetXmlSerializerSystem.Xml.Serialization.XmlSerializer内置包装器,它只是默认情况下不使用。要使用它,只需添加以下行:

var request = new RestRequest();
request.RequestFormat = RequestFormat.Xml;
request.XmlSerializer = new DotNetXmlSerializer();
request.AddBody(someObject);

在最近的一个项目中,我使用XElement(来自System.Xml.Linq程序集)手动构建请求。我只有几个属性需要处理。RestSharp解决了真正的问题,即反序列化来自服务器的大型XML图响应。

如果您的对象模型与XML模式不同,则必须创建另一个对象模型,并映射到该对象模型,以便使用某些库自动序列化它。在这种情况下,您最好手动映射到模式。

RestSharp支持一些基本的XML序列化,您可以在需要时覆盖这些序列化:

var request = new RestRequest();
request.RequestFormat = RequestFormat.Xml;
request.XmlSerializer = new SuperXmlSerializer(); // optional override, implements ISerializer
request.AddBody(person); // object serialized to XML using current XML serializer