2016-06-01 4 views
1

Ich habe Serialisierung Probleme (Ausnahmen) mit NodaTime Typen und SignalR Parametern wieSignalR nicht NodaTime Typen trotz JsonSerializer Serialisierung Einstellungen

Error converting value to type 'NodaTime.ZonedDateTime 

Error converting value \"2016-06-01T18:33:36.7279685+01 Europe/London\" to type 'NodaTime.ZonedDateTime'. Path '[0].DateCreated', line 1, position 79. 

dies trotz der docs finden und den Standard JsonSerializer ersetzt und mit der NodaTime Erweiterung Methoden und JSON.net nugget Paket zB

JsonSerializerSettings js = new JsonSerializerSettings(); 
js.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); 
var serializer = JsonSerializer.Create(js); 
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer),() => serializer); 

Antwort

1

gefunden Happily eine Abhilfe von here dank BrannonKing

Wesentlichen einen Kunden Resolver für SignalR Parameter verwendet es, die die korrekte Serializer verwendet stattdessen einen Standard zu schaffen.

Auch auf SO here verweisen aber natürlich fand nur, dass einmal begonnen hatte, meine eigene Frage zu stellen;)

hier Umbuchen für andere googeln für (die ausgezeichneten) NodaTime speziell, und einige andere Serialisierung Korrekturen zu teilen ich brauchte , wie zum Beispiel:

Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property X with type Y Path Z 

Server Startup

public void Configuration(IAppBuilder app) 
{ 
    JsonSerializerSettings js = new JsonSerializerSettings(); 
    js.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); 
    js.DateParseHandling = DateParseHandling.None; 
    js.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; 
    js.PreserveReferencesHandling = PreserveReferencesHandling.Objects; 
    var serializer = JsonSerializer.Create(js); 
    GlobalHost.DependencyResolver.Register(typeof(JsonSerializer),() => serializer); 
    var resolver = new Resolver(serializer); 
    GlobalHost.DependencyResolver.Register(typeof(IParameterResolver),() => resolver); 
} 

Benutzerdefinierte Parameter Resolver

public class Resolver : DefaultParameterResolver 
    { 
     private readonly JsonSerializer _serializer; 

     public Resolver(JsonSerializer serializer) 
     { 
      _serializer = serializer; 
     } 

     private FieldInfo _valueField; 
     public override object ResolveParameter(ParameterDescriptor descriptor, Microsoft.AspNet.SignalR.Json.IJsonValue value) 
     { 
      if(value.GetType() == descriptor.ParameterType) 
      { 
       return value; 
      } 

      if(_valueField == null) 
       _valueField = value.GetType().GetField("_value", BindingFlags.Instance | BindingFlags.NonPublic); 

      var json = (string)_valueField.GetValue(value); 
      using(var reader = new StringReader(json)) 
       return _serializer.Deserialize(reader, descriptor.ParameterType); 
     } 
    } 

Vielen Dank Brannon!

Verwandte Themen