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:
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: }