2012-05-08 2 views
1

У меня есть служба Нэнси JSON REST, который использует следующий код сериализации ...Дата сериализации между двумя .net приложениями

FormatterExtensions.AsJson(this.Response, insightManager.CaseSummary(x.caseId));

который затем deserilised по ...

public static T ParseResponseForObject<T>(string response) 
    { 
     var javaScriptSerializer = new JavaScriptSerializer(); 
     try 
     { 
      return javaScriptSerializer.Deserialize<T>(response); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(response, ex); 
     } 
    } 

И код insightManager.CaseSummary (x.caseId) возвращает экземпляр класса с нулевым значением DateTime.

Проблема заключается в том, что в процессе сериализации/десериализования дата теряет час, который я предпочитаю как-то компенсировать UTC. Что вроде anoying, потому что я хочу только часть даты в любом случае, так что похоже, что все даты - это день, прежде чем они на самом деле.

Я видел много сообщений, фиксирующих tis в javascript, но я не уверен, как их применять, когда обе части моего кода используют «стандартные» serilasers.

+0

Ожидает ли бэкенд получить UTC даты или делает это рассчитывать на получение дат в местное время? Если последний, какая другая информация отправляется для определения того, что такое местное время UTC смещение? –

+0

Это странная вещь, класс, который я сериализую в и из того же, на обоих концах службы. Существенно, что класс dto и свойства даты имеют значение NULL DateTime –

ответ

1

Итак, я нашел ответ в конце. По сути, мне просто нужно позвонить .ToLocalTime() после того, как даты будут десериализованы, чтобы я получил нужные результаты. Очень хорошее объяснение почему здесь http://www.west-wind.com/weblog/posts/2008/Sep/03/Watch-out-for-Date-Kind-in-JSON-Deserialization

Но, короче говоря, когда вы сериализуете даты JSON, они всегда преобразуются в время UTC, поэтому дата, когда вы вернетесь из десериализа, всегда будет точкой UTC, поэтому вам нужно ее преобразовать вернуться к местному времени.

Только в случае, если кто-то еще эта проблема, я адаптировали свою ParseResponseForObject<T> функцию, чтобы всегда использовать местное время для любого DateTime или DateTime? ...

public static T ParseResponseForObject<T>(string response) 
    { 
     var javaScriptSerializer = new JavaScriptSerializer(); 
     try 
     { 
      var obj = javaScriptSerializer.Deserialize<T>(response); 

      var props = obj 
       .GetType() 
       .GetProperties(BindingFlags.Instance | BindingFlags.Public); 

      foreach (var pi in props) 
      { 
       if (pi.PropertyType == typeof(DateTime)) 
       { 
        var origDt = (DateTime)pi.GetValue(obj, null); 
        pi.SetValue(obj, origDt.ToLocalTime(), null); 
       } 
       else if (pi.PropertyType == typeof(DateTime?)) 
       { 
        var origDt = (DateTime?)pi.GetValue(obj, null); 

        if (origDt.HasValue) 
        { 
         pi.SetValue(obj, origDt.Value.ToLocalTime(), null); 
        } 
       } 
      } 

      return obj; 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(response, ex); 
     } 
    }