sql >> Databáze >  >> NoSQL >> Redis

zpracování změn jmenného prostoru během deserializace JSON String

Formát "$type" je oficiálně pevně zakódován tak, aby zahrnoval jmenný prostor CLR odesílajícího systému. Takže můžete buď:

  1. Přejmenujte své jmenné prostory CLR tak, aby odpovídaly jmenným prostorům odesílajícího systému, nebo

  2. Podtřída DefaultSerializationBinder a použijte jej k přejmenování názvů jmenných prostorů CLR během deserializace nastavením v JsonSerializerSettings.Binder .

Toto je první krok, jak to udělat:

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

Poté, když deserializujete JSON, nastavte Binder v JsonSerializerSettings takhle:

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

Analýza názvu typu výše je extrémně hrubá. Našel jsem zde mnohem chytřejší analyzátor:Jak analyzovat názvy generických typů C#?. Možná budete také muset rozšířit vlastní Binder mít slovník mapování.

Podobně, pokud potřebujete přemapovat názvy jmenných prostorů při serializaci a pracujete v .Net 4.0 nebo vyšší verzi, můžete přepsat BindToName .




  1. Ukládání souborů v MongoDB pomocí GridFS

  2. MongoDB $weeklyUpdate #66 (22. dubna 2022):Hackathons, mongosh a Github

  3. Připojení MongoDb bylo odmítnuto

  4. Migrace dat s Redis