Aby mieć spójną serializację na moich warstwach aplikacji, chcę użyć tej samej biblioteki Serializacji (ServiceStack.Text) dla SignalR, której używam wszędzie indziej.Używanie ServiceStack.Text jako JSON Serializer dla SignalR
Idąc SignalR Wiki entry zastąpienia używane JSON serializatora, stworzyłem tę podstawową Handler:
public class SignalrServiceStackJsonSerializer : IJsonSerializer
{
public void Serialize(object value, TextWriter writer)
{
var selfSerializer = value as IJsonWritable;
if (selfSerializer != null)
selfSerializer.WriteJson(writer);
else
JsonSerializer.SerializeToWriter(value, writer);
}
public object Parse(TextReader reader, Type targetType)
{
return JsonSerializer.DeserializeFromReader(reader, targetType);
}
}
Integracja:
var serializer = new SignalrServiceStackJsonSerializer();
GlobalHost.DependencyResolver.Register(typeof(IJsonSerializer),() => serializer);
Niestety, po zintegrowanie jej klient SignalR JS ma nic różne pakiety niż z domyślnym serializerem. Jak wygląda, domyślny serializator generuje (przynajmniej dla wiadomości nie będących użytkownikami) JSON z właściwościami ograniczonymi do 1 znaku, który nie występuje po zastąpieniu go przez ServiceStack.Text. Tak więc SignalR próbuje uzyskać dostęp do "I", ale otrzymało "Id". Nie mogłem znaleźć odpowiednich części kodu źródłowego serwera SignalR.
Czy zrobiłem coś złego, czy muszę utworzyć bardziej złożone opakowanie do korzystania z ServiceStack.Text jako serializator JSON?
dobrze, że jest do bani;) ale dzięki za wyczyszczenie tego, będzie musiał zobaczyć, jak pracuję wokół różnic w ServiceStack.Text i JSON.Net. – Pharao2k
Hum ... to nie jest dobra wiadomość. Sądzę, że muszę włączyć oba serializatory do mojej aplikacji. – Filimindji
Dlaczego stwardnienie rozsiane używa niższego serializatora JSON SLOW JSON? ServiceStack.Text, Jil i FastJSON pokonają go na śmierć. –