El formato del "$type"
está codificado oficialmente para incluir el espacio de nombres CLR del sistema de envío. Entonces, puedes:
-
Cambie el nombre de sus espacios de nombres CLR para que coincidan con los del sistema de envío, o
-
Subclase el
DefaultSerializationBinder
y utilícelo para cambiar el nombre del espacio de nombres CLR durante la deserialización configurándolo enJsonSerializerSettings.Binder
.
El siguiente es un primer corte para hacer esto:
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;
}
}
Luego, cuando deserialice su JSON, configure el Binder
en JsonSerializerSettings
así:
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Binder = new NamespaceMappingSerializationBinder { FromNamespace = "From Namespace", ToNamespace = "Your Namespace" } };
El análisis de nombre de tipo en lo anterior es extremadamente crudo. Encontré un analizador mucho más inteligente aquí:How to parse C# generic type names?. Es posible que también deba ampliar el Binder
personalizado tener un diccionario de mapeos.
Del mismo modo, si necesita reasignar los nombres de los espacios de nombres en la serialización y está trabajando en .Net 4.0 o superior, puede anular BindToName
.