Formát "$type"
je oficiálně pevně zakódován tak, aby zahrnoval jmenný prostor CLR odesílajícího systému. Takže můžete buď:
-
Přejmenujte své jmenné prostory CLR tak, aby odpovídaly jmenným prostorům odesílajícího systému, nebo
-
Podtřída
DefaultSerializationBinder
a použijte jej k přejmenování názvů jmenných prostorů CLR během deserializace nastavením vJsonSerializerSettings.Binder
.
Toto je první krok, jak to udělat:
public class NamespaceMappingSerializationBinder : DefaultSerializationBinder
{
public string FromNamespace { get; set; }
public string ToNamespace { get; set; }
public override Type BindToType(string assemblyName, string typeName)
{
string fixedTypeName;
if (FromNamespace != null && ToNamespace != null)
{
fixedTypeName = typeName.Replace(FromNamespace, ToNamespace);
}
else
{
fixedTypeName = typeName;
}
var type = base.BindToType(assemblyName, fixedTypeName);
return type;
}
}
Poté, když deserializujete JSON, nastavte Binder
v JsonSerializerSettings
takhle:
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Binder = new NamespaceMappingSerializationBinder { FromNamespace = "From Namespace", ToNamespace = "Your Namespace" } };
Analýza názvu typu výše je extrémně hrubá. Našel jsem zde mnohem chytřejší analyzátor:Jak analyzovat názvy generických typů C#?. Možná budete také muset rozšířit vlastní Binder
mít slovník mapování.
Podobně, pokud potřebujete přemapovat názvy jmenných prostorů při serializaci a pracujete v .Net 4.0 nebo vyšší verzi, můžete přepsat BindToName
.