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