wcf désérialiser enum comme une chaîne de caractères

Je suis en train de consommer un service web RESTful en utilisant WCF. Je n'ai pas de contrôle sur le format de service web, donc je dois faire quelques solutions ici et là. Un gros problème je n'arrive pas à se déplacer, cependant, est de savoir comment faire de la WCF désérialiser un enum comme une chaîne de caractères.

C'est mon code (les noms ont été changés, évidemment):

[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; }
}

Et c'est le retour des données qui ne désérialisation:

{
     "id":123456,
     "name":"John Doe",
     "foo":"bar"
}

Enfin, l'exception levée:

Il y a une erreur de la désérialisation d'un objet de type Service.Foo. La valeur 'bar' ne peut pas être analysée comme le type Int64'.

Je ne veux pas passer à l'utilisation de la XmlSerializer, parce que, parmi ses nombreuses autres lacunes, il ne me laisse pas avoir privé les setters sur propriétés.

Comment puis-je faire WCF (ou, bien, le DataContractSerializer) traiter mon enum en tant que chaîne de valeurs?

MODIFIER: Faire ce qui semble être impossible, et le comportement est la façon dont il est par la conception. Merci Microsoft, pour ne pas donner de nous, d'avoir recours à des hacks. Faire de la même manière somori suggère semble être la seule façon d'obtenir de la chaîne des enums avec JSON et WCF.

  • Avez-vous essayé la construction d'un UNameIt objet dans le code et en utilisant le DataContractSerializer pour sérialiser (et puis désérialiser) pour voir si peut-être la sérialisation inadéquations le message que vous recevez?
  • La chose est, je ne suis pas la pour faire de la sérialisation. Cette JSON provient d'un tiers. Je ne peux pas contrôler quoi que ce soit, la seule chose que j'ai le contrôle sur est la désérialisation, sauf que je ne le pense pas, parce que je ne peux pas obtenir de la WCF pour désérialiser un enum la façon dont ces gars configurer les énumérations. Je souhaite que le DataContractSerializer est plus souple.
  • Oui, je comprends que vous n'avez aucun contrôle sur elle, il serait peut-être allusion au problème, par contre si vous pouviez comparer une auto-objet sérialisé avec ce que vous obtenez à partir de la troisième partie de comprendre pourquoi le sérialiseur ne l'aime pas.
  • Essayez d'éviter d'exposer les enums de données wcf contrats, parce qu'ils créent de subtils compatible problèmes. Voir stackoverflow.com/questions/326339/...
  • Si vous faites attention, vous verrez que cette question a été posée de deux mois avant que l'on vous parle. Si quoi que ce soit, que l'on est un double de celui-ci.
  • la politique acceptée, de SORTE que vous pouvez fermer les plus âgés q avec la plus récente, si ce dernier a reçu plus d'attention/est-mieux-libellé etc. Qui a dit que je rétracte mon vote serré, parce que c'est sur DataContractSerializer dans WCF contexte, tandis que l'autre est sur le JavascriptSerializer dans ASP.NET. Je devrais être plus prudent! 🙂
  • êtes-vous à l'aide de DataContractSerializer ou DataContractJsonSerializer ?
  • Je ne me souviens même plus, c'était il y a quatre ans.

InformationsquelleAutor Alex | 2010-01-22