Estoy intentando consumir un servicio web RESTful usando WCF. No tengo control sobre el formato del servicio web, así que tengo que hacer algunas soluciones aquí y allá. Sin embargo, uno de los principales problemas que no logro resolver es cómo hacer que WCF deserialice una enumeración como una cadena.wcf deserialize enum como cadena
Este es mi código (nombres cambiados, obviamente):
[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; }
}
Y estos son los datos devueltos que se produce un error de deserialización:
{
"id":123456,
"name":"John Doe",
"foo":"bar"
}
Por último, la excepción lanzada:
Hubo un error al deserializar el objeto de tipo Service.Foo. El valor 'bar' no se puede analizar como el tipo 'Int64'.
No quiero cambiar al uso de XmlSerializer, porque, entre sus muchas otras deficiencias, no me dejará establecer entidades privadas en las propiedades.
¿Cómo puedo hacer que WCF (o, bueno, el DataContractSerializer) trate mi enumeración como valores de cadena?
EDIT: Hacer esto parece ser imposible, y el comportamiento es la forma en que es por diseño. Gracias Microsoft, por no darnos opciones, tener que recurrir a hacks. Hacerlo de la manera que sugiere somori parece ser la única forma de obtener enumeraciones de cadenas con JSON y WCF.
¿Ha intentado crear un objeto UnameIt en código y usar el DataContractSerializer para serializarlo (y luego deserializarlo) para ver si tal vez la serialización no coincide con el mensaje que recibe? – GaussZ
La cuestión es que yo no soy el que está haciendo la serialización. Este JSON proviene de un tercero. No puedo controlar nada al respecto, lo único que tengo control es la deserialización, excepto que supongo que no, porque no puedo lograr que WCF deserialice una enumeración de la forma en que estos tipos establecen enums. Ojalá DataContractSerializer fuera más flexible. – Alex
Sí entiendo que usted no tiene ningún control sobre él, sería tal vez insinuar el problema, aunque si se podría comparar un objeto auto-serializado con lo que se obtiene a partir del tercero para entender por qué el serializador no le gusta. – GaussZ