sql >> Databasteknik >  >> NoSQL >> Redis

hantera namnutrymmesändringar under deserialisering av JSON String

Formatet för "$type" är officiellt hårdkodad för att inkludera CLR-namnområdet för det sändande systemet. Så du kan antingen:

  1. Byt namn på dina CLR-namnområden så att de matchar det sändande systemet, eller

  2. Underklass DefaultSerializationBinder och använd den för att byta namn på CLR-namnområdena under deserialisering genom att ställa in den i JsonSerializerSettings.Binder .

Följande är ett första steg för att göra detta:

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

Sedan, när du avserialiserar din JSON, ställ in Binder i JsonSerializerSettings som så:

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

Typnamnsanalysen ovan är extremt grov. Jag hittade en mycket smartare parser här:Hur analyserar man C# generiska typnamn?. Du kan också behöva utöka den anpassade Binder att ha en ordbok över mappningar.

På samma sätt, om du behöver mappa om namnområdets namn vid serialisering och arbetar i .Net 4.0 eller senare, kan du åsidosätta BindToName .




  1. MongoDB:Beräkna uppehållstid mellan varje statusvärdeändring

  2. Hur kan jag skapa ett index med pymongo

  3. Är det möjligt att få enstaka resultat sammanlagt?

  4. Hur man bäst skapar ett RESTful API i Node.js