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

håndtering af navnerumsændringer under deserialisering af JSON String

Formatet for "$type" er officielt hardkodet til at inkludere CLR-navneområdet for det afsendende system. Så du kan enten:

  1. Omdøb dine CLR-navneområder, så de matcher dem i det afsendende system, eller

  2. Underklasser DefaultSerializationBinder og brug det til at omdøbe CLR-navneområdets navne under deserialisering ved at indstille det i JsonSerializerSettings.Binder .

Følgende er et første snit til at gøre dette:

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

Når du derefter deserialiserer din JSON, skal du indstille Binder i JsonSerializerSettings sådan:

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

Typenavnsanalysen i ovenstående er ekstremt grov. Jeg fandt en meget smartere parser her:Hvordan parser man C# generiske typenavne?. Du skal muligvis også udvide det tilpassede Binder at have en ordbog over kortlægninger.

På samme måde kan du tilsidesætte BindToName, hvis du har brug for at omforme navneområdets navne ved serialisering og arbejder i .Net 4.0 eller nyere. .




  1. Mongoose-opdatering uden tilbagekald

  2. Mongoose/node.js hvordan man finder, udfylder, laver ting, 'affolker' og opdaterer

  3. Installation af Memcached på CentOS 8

  4. Redis udløb af tasterumsmeddelelse udløses ikke