Я пытаюсь использовать веб-службу RESTful с помощью WCF. У меня нет контроля над форматом веб-службы, поэтому я должен найти несколько обходных путей здесь и там. Однако одна серьезная проблема, которую я не могу решить, - это как заставить WCF десериализовать перечисление как строку.
Это мой код (имена, очевидно, изменены):
[DataContract]
public enum Foo
{
[EnumMember( Value = "bar" )]
Bar,
[EnumMember( Value = "baz" )]
Baz
}
[DataContract]
public class UNameIt
{
[DataMember( Name = "id" )]
public long Id { get; private set; }
[DataMember( Name = "name" )]
public string Name { get; private set; }
[DataMember( Name = "foo" )]
public Foo Foo { get; private set; }
}
И это возвращенные данные, которые не прошли десериализацию:
{
"id":123456,
"name":"John Doe",
"foo":"bar"
}
Наконец, выброшено исключение:
Произошла ошибка десериализации объекта типа Service.Foo. Значение bar не может быть проанализировано как тип Int64.
Я не хочу переключаться на использование XmlSerializer, потому что, среди множества других недостатков, он не позволяет мне иметь частные установщики свойств.
Как мне заставить WCF (или, ну, DataContractSerializer) обрабатывать мое перечисление как строковые значения?
РЕДАКТИРОВАТЬ: это кажется невозможным, и поведение таково, как задумано. Спасибо, Microsoft, за то, что не предоставили нам возможности прибегать к хакерским атакам. Делать это так, как предлагает Сомори, кажется, единственный способ получить перечисления строк с помощью JSON и WCF.
DataContractSerializer
в контексте WCF, а о другом - оJavascriptSerializer
в ASP.NET. Я должен быть поосторожнее! :) - person nawfal   schedule 17.07.2014DataContractSerializer
илиDataContractJsonSerializer
? - person nawfal   schedule 17.07.2014