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 leJavascriptSerializer
dans ASP.NET. Je devrais être plus prudent! 🙂 - êtes-vous à l'aide de
DataContractSerializer
ouDataContractJsonSerializer
? - Je ne me souviens même plus, c'était il y a quatre ans.
Vous devez vous connecter pour publier un commentaire.
Cela peut être une question stupide.
Ce qui se passe si vous ne
?
foo
bien, et depuis que j'ai seulement besoin de la désérialisation, j'avais seulement besoin de lire leFoo
valeur, jamais la définir.Je sais que c'est un vieux post, mais je pense qu'il vaut la peine de mentionner.
J'ai reçu une erreur similaire où la désérialisation de la chaîne json échoué, semblant désérialiser les mauvais types.
Le correctif pour moi était simplement encoder la chaîne json avant de les envoyer au serveur. Simple, mais une erreur facile à faire.
Er..? Ne sont pas des enums en entier? L'exception est valable. Je ne sais pas si cela aide: http://msdn.microsoft.com/en-us/library/aa347875.aspx
Ceci est peut-être dû au fait que le setter est privé et l'a signalé l'erreur est trompeuse. Les Foo est le premier bien désérialisé et depuis pas de setter est disponible, il lève une exception.