2012-02-22 37 views
5

Tengo un servicio WCF que utiliza JSON como RequestFormat y ResponseFormat.WCF DataMember DateTime Serializing Format

[ServiceContract]  
public interface IServiceJSON 
{ 

    [OperationContract] 
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] 
    MyClassA echo(MyClassA oMyObject); 

} 

[DataContract] 
public class MyClassA 
{ 
    [DataMember] 
    public string message; 

    [DataMember] 
    public List<MyClassB> myList; 

    public MyClassA() 
    { 
     myList = new List<MyClassB>(); 
    } 
} 

[DataContract] 
public class MyClassB 
{ 
    [DataMember] 
    public int myInt; 

    [DataMember] 
    public double myDouble; 

    [DataMember] 
    public bool myBool; 

    [DataMember] 
    public DateTime myDateTime; 

} 

La propiedad myDateTime de la clase MyClassB es del tipo DateTime. Esto se está serializando en el siguiente formato: "myDateTime": "/ Date (1329919837509 + 0100) /"

El cliente con el que necesito comunicarme no puede tratar este formato. Requiere que sea un formato más convencional como por ejemplo: aaaa-MM-dd hh: mm: ss

¿Es de alguna manera posible agregar esto al atributo DataMember? De este modo:

[DataMember format = “yyyy-MM-dd hh:mm:ss”] 
public DateTime myDateTime; 

Gracias de antemano!

+0

¿Encontró una solución? La única forma en que lo hice fue una solución alternativa, http://stackoverflow.com/questions/25894068/change-the-json-datetime-serialization-in-wcf-4-0-rest-service – bpeikes

+0

No existe una solución real, excepto por La solución descrita por tad donaghe a continuación, que se reduce a lo mismo que a lo que se refiere: agregar un miembro de datos adicional de tipo cadena. Tal vez deberías editar la respuesta de Tad y agregar tu ejemplo para que esté completa. – Brabbeldas

+0

Sí, he consultado el código de referencia de MS para WCF y serialización y no se puede leer. No es de extrañar que parezca que han descargado REST sobre WCF. – bpeikes

Respuesta

2

¿Por qué no simplemente pasarlo como una cadena ya formateada?

Es decir, no pase la fecha en su DataContract como una fecha. En su lugar, haga que ese miembro sea una cadena y formatee la cadena de la manera que lo desea su cliente.

+0

¿Podría explicar lo que quiere decir? – Brabbeldas

+0

Actualicé mi respuesta un poco. –

5

He aquí un ejemplo de la respuesta ya comprobado ...

[DataContract] 
public class ProductExport 
{ 
    [DataMember] 
    public Guid ExportID { get; set; } 

    [DataMember(EmitDefaultValue = false, Name = "updateStartDate")] 
    public string UpdateStartDateStr 
    { 
     get 
     { 
      if(this.UpdateStartDate.HasValue) 
       return this.UpdateStartDate.Value.ToUniversalTime().ToString("s", CultureInfo.InvariantCulture); 
      else 
       return null; 
     } 
     set 
     { 
      // should implement this... 
     } 
    } 

    // this property is not transformed to JSon. Basically hidden 
    public DateTime? UpdateStartDate { get; set; } 

    [DataMember] 
    public ExportStatus Status { get; set; } 
} 

La clase anterior define dos métodos para manejar la UpdateStartDate. ¿Uno que contiene la propiedad DateTime que se puede anular y el otro convierte el DateTime? a una cadena para la respuesta JSon de mi servicio.