Mittwoch, 3. Juli 2013

DateTime Probleme bei JSON-Konvertierung mittels JavaScriptSerializer

Mit dem JavaScriptSerializer stellt Microsoft freundlicherweise eine Möglichkeit bereit .NET-Objekte in JSON umzuwandeln. Ebenfalls großartig ist das man mit damit auch aus JSON wieder ein .NET-Objekt erzeugen kann. Weniger großartig ist folgendes:

var now = DateTime.Now;

var s = new JavaScriptSerializer(); 
var serialized = s.Serialize(now);  
var notNow = s.Deserialize<DateTime>(serialized);

Denn sofern man nicht UTC als Zeitzone verwendet sind now und notNow nicht gleich. Gewissermaßen sind sie schon gleich weil now.Kind == DateTimeKind.Local und notNow = DateTimeKind.Utc ist und beide den selben Zeitpunkt beschreiben. Intuitiv ist es aber nicht.

Vielleicht sollte Serialize() standardmäßig eine Exception werfen, wenn es auf ein DateTime stößt, dass keine UTC-Zeit beschreibt. Dann könnte man vielleicht über s.AllowLocalDateTimes = true dieses Verhalten steuern. So wäre man beim Programmieren gezwungen sich darüber Gedanken zu machen, mit was für DateTimes man arbeitet.