Le format du "$type"
est officiellement codé en dur pour inclure l'espace de noms CLR du système expéditeur. Ainsi, vous pouvez soit :
-
Renommez vos espaces de noms CLR pour qu'ils correspondent à ceux du système expéditeur, ou
-
Sous-classe le
DefaultSerializationBinder
et utilisez-le pour renommer les noms d'espace de noms CLR lors de la désérialisation en le définissant dans leJsonSerializerSettings.Binder
.
Voici une première étape :
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;
}
}
Ensuite, lorsque vous désérialisez votre JSON, définissez le Binder
dans les JsonSerializerSettings
comme ça :
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Binder = new NamespaceMappingSerializationBinder { FromNamespace = "From Namespace", ToNamespace = "Your Namespace" } };
L'analyse du nom de type dans ce qui précède est extrêmement grossière. J'ai trouvé un analyseur beaucoup plus intelligent ici :Comment analyser les noms de types génériques C# ?. Vous devrez peut-être également étendre le Binder
personnalisé pour avoir un dictionnaire de mappages.
De même, si vous devez remapper les noms d'espace de noms lors de la sérialisation et que vous travaillez dans .Net 4.0 ou supérieur, vous pouvez remplacer BindToName
.