O formato do
"$type"
é oficialmente codificado para incluir o namespace CLR do sistema de envio. Então, você pode:-
Renomeie seus namespaces CLR para corresponder aos do sistema de envio ou
-
Subclasse oDefaultSerializationBinder
e use-o para renomear os nomes de namespace CLR durante a desserialização, definindo-o noJsonSerializerSettings.Binder
.
O seguinte é um primeiro corte para fazer isso:
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;
}
}
Então, quando você desserializar seu JSON, defina o
Binder
em JsonSerializerSettings
igual a:JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Binder = new NamespaceMappingSerializationBinder { FromNamespace = "From Namespace", ToNamespace = "Your Namespace" } };
A análise do nome do tipo acima é extremamente grosseira. Encontrei um analisador muito mais inteligente aqui:Como analisar nomes de tipo genéricos C#?. Você também pode precisar estender o
Binder
personalizado ter um dicionário de mapeamentos. Da mesma forma, se você precisar remapear os nomes de namespace na serialização e estiver trabalhando no .Net 4.0 ou superior, poderá substituir
BindToName
.