sql >> Base de Datos >  >> NoSQL >> Redis

manejo de cambios en el espacio de nombres durante la deserialización de JSON String

El formato del "$type" está codificado oficialmente para incluir el espacio de nombres CLR del sistema de envío. Entonces, puedes:

  1. Cambie el nombre de sus espacios de nombres CLR para que coincidan con los del sistema de envío, o

  2. Subclase el DefaultSerializationBinder y utilícelo para cambiar el nombre del espacio de nombres CLR durante la deserialización configurándolo en JsonSerializerSettings.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 .