Redis
 sql >> Base de données >  >> NoSQL >> Redis

gestion des changements d'espace de noms lors de la désérialisation de la chaîne JSON

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 :

  1. Renommez vos espaces de noms CLR pour qu'ils correspondent à ceux du système expéditeur, ou

  2. 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 le JsonSerializerSettings.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 .