Het formaat van de "$type"
is officieel hardgecodeerd om de CLR-naamruimte van het verzendende systeem op te nemen. U kunt dus ofwel:
-
Hernoem uw CLR-naamruimten zodat ze overeenkomen met die van het verzendende systeem, of
-
Subklasse de
DefaultSerializationBinder
en gebruik het om de namen van de CLR-naamruimten te hernoemen tijdens deserialisatie door het in te stellen in deJsonSerializerSettings.Binder
.
Het volgende is een eerste stap om dit te doen:
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;
}
}
Stel vervolgens, wanneer u uw JSON deserialiseert, de Binder
. in in de JsonSerializerSettings
zoals zo:
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Binder = new NamespaceMappingSerializationBinder { FromNamespace = "From Namespace", ToNamespace = "Your Namespace" } };
Het ontleden van de typenaam in het bovenstaande is extreem grof. Ik heb hier een veel slimmere parser gevonden:hoe kan ik generieke typenamen van C# ontleden?. Mogelijk moet u ook de aangepaste Binder
uitbreiden om een woordenboek met toewijzingen te hebben.
Evenzo, als u de naamruimtenamen opnieuw moet toewijzen bij serialisatie en werkt in .Net 4.0 of hoger, kunt u BindToName
overschrijven .