2017-02-09 23 views
0

У меня есть свойство List<AnimalsEnum> Foo в классе, который я сериализую в XML с RestSharp для тела запроса. Я хотел бы выход быть:Restsharp - как сериализовать список перечислений на строки

<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); 
+0

Не могли бы вы разместить соответствующий код? – Dennis

+0

@Dennis обновленный вопрос – user3791372

+0

Почему вы хотите, чтобы результат был ' Elephant' и так далее? Я просмотрел «XmlSerializer» BCL, он сериализует перечисления из списка как « Tiger», и это выглядит гораздо правильнее, чем повторение тегов Foo. – Dennis

ответ

0

Вы можете использовать встроенный в DotNetXmlSerializer из RestSharp сделать Microsoft, XmlSerializer выполните фактическую сериализацию. Затем вы можете использовать XML serialization attributes, чтобы указать, что List<AnimalsEnum> из Bar следует сериализовать без внешнего элемента контейнера путем применения [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 может только сериализовать общедоступные типы.