Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Handhabung von Namespace-Änderungen während der Deserialisierung von JSON-String

Das Format von "$type" ist offiziell hartcodiert, um den CLR-Namespace des sendenden Systems einzuschließen. Sie können also entweder:

  1. Benennen Sie Ihre CLR-Namespaces um, damit sie mit denen des sendenden Systems übereinstimmen, oder

  2. Unterklasse von DefaultSerializationBinder und verwenden Sie es, um die CLR-Namespace-Namen während der Deserialisierung umzubenennen, indem Sie es in JsonSerializerSettings.Binder festlegen .

Das Folgende ist ein erster Versuch, dies zu tun:

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

Wenn Sie dann Ihren JSON deserialisieren, legen Sie den Binder fest in den JsonSerializerSettings etwa so:

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

Die Analyse des Typnamens oben ist extrem grob. Ich habe hier einen viel intelligenteren Parser gefunden:How to parse C# Generic Type Names?. Möglicherweise müssen Sie auch den benutzerdefinierten Binder erweitern um ein Zuordnungswörterbuch zu haben.

Wenn Sie die Namespace-Namen bei der Serialisierung neu zuordnen müssen und in .Net 4.0 oder höher arbeiten, können Sie auf ähnliche Weise BindToName überschreiben .