Redis
 sql >> Database >  >> NoSQL >> Redis

gestione delle modifiche allo spazio dei nomi durante la deserializzazione della stringa JSON

Il formato del "$type" è ufficialmente codificato per includere lo spazio dei nomi CLR del sistema di invio. Quindi, puoi:

  1. Rinomina i tuoi spazi dei nomi CLR in modo che corrispondano a quelli del sistema di invio, oppure

  2. Sottoclasse il DefaultSerializationBinder e usalo per rinominare i nomi dello spazio dei nomi CLR durante la deserializzazione impostandolo in JsonSerializerSettings.Binder .

Quello che segue è un primo taglio per fare questo:

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;
    }
}

Quindi, quando deserializzi il tuo JSON, imposta il Binder in JsonSerializerSettings così:

JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Binder = new NamespaceMappingSerializationBinder { FromNamespace = "From Namespace", ToNamespace = "Your Namespace" } };

L'analisi del nome del tipo sopra è estremamente grezza. Ho trovato un parser molto più intelligente qui:come analizzare i nomi dei tipi generici C#?. Potrebbe anche essere necessario estendere il Binder personalizzato avere un dizionario di mappature.

Allo stesso modo, se devi rimappare i nomi degli spazi dei nomi durante la serializzazione e stai lavorando in .Net 4.0 o versioni successive, puoi sovrascrivere BindToName .