fbpx
devstyle.pl - Blog dla każdego programisty
devstyle.pl - Blog dla każdego programisty
2 minut

Serializacja do JSON – c.d.


24.06.2011

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:  }
0 0 votes
Article Rating
7 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
k
k
12 years ago

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

mgibas
mgibas
12 years ago

@k

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

Daniel Luberda
Daniel Luberda
12 years ago

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

procent
12 years ago

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

Daniel Luberda
Daniel Luberda
12 years ago

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

andrew
andrew
12 years ago

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
12 years ago

Ś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…

Kurs Gita

Zaawansowany frontend

Szkolenie z Testów

Szkolenie z baz danych

Książka

Zobacz również