【问题标题】:Restsharp - how to serialize a list of enums to stringsRestsharp - 如何将枚举列表序列化为字符串
【发布时间】:2017-02-09 05:41:42
【问题描述】:

我在一个类中有一个 List<AnimalsEnum> Foo 属性,我使用 RestSharp 将其序列化为 XML 作为请求的正文。我希望输出是:

<rootNode>
    ... existing content...
    <Foo>Elephant</Foo>
    <Foo>Tiger</Foo>
    .... more content

相反,对于相关的序列化部分,我有

<Foo>
    <AnimalsEnum />
    <AnimalsEnum />
</Foo>

我想将枚举值转换为字符串并删除自动添加的容器元素。 RestSharp可以做到这一点吗?我认为这可能与属性有关,但显然不是。我是否必须自己使用自定义序列化程序来处理这个输出?

代码很难发布,但与示例保持一致:

class Bar
{
    public string Name{get;set;}
    public List<AnimalsEnum> Foo{get;set;}
    public enum AnimalsEnum {Tiger,Elephant,Monkey}
}

并序列化为一个请求

var req = new RestSharp.RestRequest(RestSharp.Method.POST);
req.RequestFormat = RestSharp.DataFormat.Xml;
req.AddQueryParameter("REST-PAYLOAD", "");
req.AddXmlBody(myBar);

【问题讨论】:

  • 能贴出相关代码吗?
  • @Dennis 更新问题
  • 为什么要输出为&lt;Foo&gt;Elephant&lt;/Foo&gt;等等?我查看了 BCL 的XmlSerializer,它将列表中的枚举序列化为&lt;AnimalsEnum&gt;Tiger&lt;/AnimalsEnum&gt;,这看起来更正确,而不是重复Foo 标签。
  • 别怪我,怪ebay!最终是为了 ebay api
  • 恐怕,我们这里有两个问题。第一个是默认RestRequest 的序列化程序中的错误。第二个是服务器希望以某种非标准方式序列化请求。恕我直言,两者都可以通过替换默认序列化程序来解决 - 您需要在 BCL 的 XmlSerializer 之上实现 ISerializer,并编写自定义序列化逻辑。然后将您的序列化程序分配给RestRequest.XmlSerializer

标签: c# xml serialization restsharp


【解决方案1】:

可以使用RestSharp内置的DotNetXmlSerializer,让微软的XmlSerializer做实际的序列化。然后您可以使用XML serialization attributes 来指定BarList&lt;AnimalsEnum&gt; 应该通过应用[XmlElement] 在没有外部容器元素的情况下进行序列化:

public class Bar
{
    public string Name { get; set; }
    [System.Xml.Serialization.XmlElement]
    public List<AnimalsEnum> Foo { get; set; }
    public enum AnimalsEnum { Tiger, Elephant, Monkey }
}

然后,在发出请求时,请执行以下操作:

var req = new RestSharp.RestRequest(RestSharp.Method.POST);

// Use XmlSerializer to serialize Bar
req.XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer(); 

req.RequestFormat = RestSharp.DataFormat.Xml;
req.AddQueryParameter("REST-PAYLOAD", "");
req.AddXmlBody(myBar);

注意Bar 必须是公共的,因为XmlSerializer 只能序列化公共类型。

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 2020-03-24
    • 1970-01-01
    相关资源
    最近更新 更多