Я пытаюсь использовать УСПОКОИТЕЛЬНЫЙ веб-сервис с помощью 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"
}
Наконец, выданное исключение:
Была ошибка при десериализации объекта Сервиса типа. Нечто. Значение 'панель' не может быть проанализировано как тип 'Int64'.
Я не хочу переключаться на использование XmlSerializer, потому что среди его многих других недостатков это не позволит мне иметь частные методы set на свойствах.
Как я делаю WCF (или, ну, в общем, DataContractSerializer) рассматривают мое перечисление как строковые значения?
Править: Выполнение этого, кажется, невозможно, и поведение является способом, которым это дизайном. Спасибо Microsoft, для того, чтобы не давать нам опции, имея необходимость обратиться к взломам. Выполнение его, который предлагает путь somori, кажется, единственный способ получить строковые перечисления с JSON и WCF.
Это может быть глупым вопросом.
Что произойдет, если вы делаете
[DataMember( Name = "foo" )]
private string foo { get; private set; }
public Foo Foo
{
get
{
return Foo.Parse(foo);
}
}
?
..? Не уникают целое число? Исключение действительно. Я не знаю, если это поможет: http://msdn.microsoft.com/en-us/library/aaa347875.aspx