2012-02-22 15 views
5

Mam działającą usługę WCF, która używała JSON jako jej RequestFormat i 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; 

} 

Właściwość myDateTime klasy MyClassB jest typu DateTime. To jest serializowane do następującego formatu: "myDateTime": "/ Data (1329919837509 + 0100) /"

Klient, z którym muszę się komunikować, nie może obsłużyć tego formatu. Wymaga to bardziej konwencjonalnego formatu, na przykład: rrrr-MM-dd gg: mm: ss

Czy jest możliwe dodanie tego do atrybutu DataMember? Podobnie jak:

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

Z góry dziękuję!

+0

Czy znalazłeś rozwiązanie? Jedyny sposób, w jaki to zrobiłem, to obejście problemu, http://stackoverflow.com/questions/25894068/change-the-json-datetime-serialization-in-wcf-4-0-rest-service – bpeikes

+0

Nie ma prawdziwego rozwiązania z wyjątkiem obejście opisane przez tad donaghe poniżej, które sprowadza się do tego, o czym mówisz: dodaj dodatkowy datamember typu string. Może powinieneś edytować odpowiedź tada i dodać swój przykład do kompletności. – Brabbeldas

+0

Tak, patrzyłem na kod referencyjny MS dla WCF i serializacji i jest nieczytelne. Nic dziwnego, że wydaje się, że porzucili REST nad WCF. – bpeikes

Odpowiedz

2

Dlaczego po prostu nie przekazać go jako już sformatowanego ciągu znaków?

Oznacza to, że nie należy podawać daty w DataContract jako daty. Utwórz dla tego elementu ciąg znaków, a następnie sformatuj ciąg znaków w taki sposób, w jaki chce tego klient.

+0

Proszę wyjaśnić, co masz na myśli? – Brabbeldas

+0

Zaktualizowałem trochę odpowiedź. –

5

Oto przykład sprawdzonych już odpowiedź ...

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

Klasa powyżej definiuje dwie metody radzenia sobie z UpdateStartDate. Jeden zawierający zerowalną właściwość DateTime, a drugi konwersję DateTime? do ciągu znaków dla odpowiedzi JSon z mojej usługi.