Serializacja do JSON - c.d.

24 czerwca 2011 10:34 w kategorii: pro

Ostatnim razem rozpisałem się na temat serializacji WSZYSTKIEGO, nawet interfejsów, do JSONa i możliwością ich deserializacji do odpowiednich klas. Bardzo szybko pojawił się jednak problem: przedstawiony przeze mnie sposób wypluwa z siebie informacje nie tylko o źródłowym typie, ale także o dllce z której ów typ pochodzi. W wielu przypadkach może być to działanie pożądane, jednak u mnie kluczowym aspektem całej sprawy była "przenaszalność" zserializowanych akcji pomiędzy wersjami oprogramowania.

Rozwiązanie okazało się dość proste: wystarczy napisać własny JavaScriptTypeResolver! Po podejrzeniu implementacji standardowego SimpleTypeResolver zauważyć da się, że taka implementacja nie powinna nikomu nastręczyć żadnych trudności:

simpletyperesolver

Dziedziczę z klasy bazowej, zwracam Type.FullName zamiast AssemblyQualifiedName i... tyle!

  1:  public class ExecutableActionsTypeResolver: JavaScriptTypeResolver
  2:  {
  3:      public override Type ResolveType(string id)
  4:      {
  5:          return Type.GetType(id, true);
  6:      }
  7:  
  8:      public override string ResolveTypeId(Type type)
  9:      {
 10:          return type.FullName;
 11:      }
 12:  }
 13:  
 14:  public class ExecutableActionsSerializer : JavaScriptSerializer
 15:  {
 16:      public ExecutableActionsSerializer()
 17:          : base(new ExecutableActionsTypeResolver())
 18:      {
 19:      }
 20:  }

Komentarze

dotnetomaniak.pl

24 czerwca 2011 11:38

Maciej Aniserowicz | Serializacja do JSON - c.d.

Dziękujemy za publikację - Trackback z dotnetomaniak.pl

k

24 czerwca 2011 13:02

"przenaszalność"?
Chyba lepszym słowem i jednocześnie bardziej poprawnym byłaby "przenośność"?

mgibas

24 czerwca 2011 13:34

@k

Bardziej poprawną formą jest "przenaszalność" - mi też to brzmi dziwnie, ale co zrobić :)

Daniel Luberda

24 czerwca 2011 16:59

Do serializacji/deserializacji JSON i nie tylko polecam https://github.com/ServiceStack/ServiceStack.Text

procent

24 czerwca 2011 17:13

Daniel,
Dzięki za linka, wygląda bardzo fajne! Trzeba będzie o tym pamiętać na przyszłość:)

Daniel Luberda

25 czerwca 2011 10:14

Spoko;) Ja sam jestem pod wrażeniem projektu ServiceStack jako alternatywy dla WCF Webservices. Działa ****iście:>

andrew

25 czerwca 2011 12:17

Już od dawna korzystam z ServiceStack.Text, który deserializuje/serializuje z/do klas bez żadnych kombinacji, no i robi to o wiele wydajniej niż mechanizmy zawarte w .net.

andrzej

26 czerwca 2011 16:39

Świetne są rozwiązania, które wymagają więcej zastanowienia niż napisanych linii kodu :) Przydatna rzecz.
ps: dajcie spokój z tym poprawianiem zwrotów.. Szerzy się "plaga" językowych purystów z bloga na blog...

Komentarze zamknięte