Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

manipulando alterações de namespace durante a desserialização de JSON String


O formato do "$type" é oficialmente codificado para incluir o namespace CLR do sistema de envio. Então, você pode:

  1. Renomeie seus namespaces CLR para corresponder aos do sistema de envio ou

  2. Subclasse o DefaultSerializationBinder e use-o para renomear os nomes de namespace CLR durante a desserialização, definindo-o no JsonSerializerSettings.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 .