Il formato del "$type"
è ufficialmente codificato per includere lo spazio dei nomi CLR del sistema di invio. Quindi, puoi:
-
Rinomina i tuoi spazi dei nomi CLR in modo che corrispondano a quelli del sistema di invio, oppure
-
Sottoclasse il
DefaultSerializationBinder
e usalo per rinominare i nomi dello spazio dei nomi CLR durante la deserializzazione impostandolo inJsonSerializerSettings.Binder
.
Quello che segue è un primo taglio per fare questo:
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;
}
}
Quindi, quando deserializzi il tuo JSON, imposta il Binder
in JsonSerializerSettings
così:
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Binder = new NamespaceMappingSerializationBinder { FromNamespace = "From Namespace", ToNamespace = "Your Namespace" } };
L'analisi del nome del tipo sopra è estremamente grezza. Ho trovato un parser molto più intelligente qui:come analizzare i nomi dei tipi generici C#?. Potrebbe anche essere necessario estendere il Binder
personalizzato avere un dizionario di mappature.
Allo stesso modo, se devi rimappare i nomi degli spazi dei nomi durante la serializzazione e stai lavorando in .Net 4.0 o versioni successive, puoi sovrascrivere BindToName
.