c# - wcf deserialize enum como cadena
.net enums (4)
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.
Este es mi código (los nombres han cambiado, 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 este es el dato devuelto que falla la deserialización:
{
"id":123456,
"name":"John Doe",
"foo":"bar"
}
Finalmente, la excepción arrojada:
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 permitirá tener instaladores privados en las propiedades.
¿Cómo puedo hacer que WCF (o, bueno, el DataContractSerializer) trate mi enumeración como valores de cadena?
EDITAR : Hacer esto parece ser imposible, y el comportamiento es como 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.
Er ...? ¿Las enum no son enteros? La excepción es válida No sé si esto ayuda: http://msdn.microsoft.com/en-us/library/aa347875.aspx
Esta podría ser una pregunta tonta.
Que pasa si tu lo haces
[DataMember( Name = "foo" )]
private string foo { get; private set; }
public Foo Foo
{
get
{
return Foo.Parse(foo);
}
}
?
Sé que esta es una publicación anterior, pero creo que vale la pena mencionarla.
Recibí un error similar donde falló la deserialización de la cadena json, pareciendo deserializar a los tipos incorrectos.
La solución para mí fue simplemente URL codificar la cadena json antes de enviarla al servidor. Un error simple pero fácil de hacer.
HttpUtility.UrlEncode(JSONInstruction) /*remember to encode the string*/
Esto tal vez está sucediendo porque el colocador es privado y el error informado es engañoso. El Foo es la primera propiedad en ser deserializada y dado que no hay un organismo público disponible, arroja una excepción.