wcf десериализовывают перечисление как строку

Я пытаюсь использовать УСПОКОИТЕЛЬНЫЙ веб-сервис с помощью 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.

20
задан Alex 28 January 2010 в 07:21
поделиться

2 ответа

Это может быть глупым вопросом.

Что произойдет, если вы делаете

[DataMember( Name = "foo" )]
private string foo { get; private set; }

public Foo Foo 
{ 
  get 
  {
    return Foo.Parse(foo);
  }
}

?

7
ответ дан 30 November 2019 в 01:34
поделиться

..? Не уникают целое число? Исключение действительно. Я не знаю, если это поможет: http://msdn.microsoft.com/en-us/library/aaa347875.aspx

0
ответ дан 30 November 2019 в 01:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: