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:
-
Byt namn på dina CLR-namnområden så att de matchar det sändande systemet, eller
-
Underklass
DefaultSerializationBinder
och använd den för att byta namn på CLR-namnområdena under deserialisering genom att ställa in den iJsonSerializerSettings.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
.