Das Format von "$type"
ist offiziell hartcodiert, um den CLR-Namespace des sendenden Systems einzuschließen. Sie können also entweder:
-
Benennen Sie Ihre CLR-Namespaces um, damit sie mit denen des sendenden Systems übereinstimmen, oder
-
Unterklasse von
DefaultSerializationBinder
und verwenden Sie es, um die CLR-Namespace-Namen während der Deserialisierung umzubenennen, indem Sie es inJsonSerializerSettings.Binder
festlegen .
Das Folgende ist ein erster Versuch, dies zu tun:
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;
}
}
Wenn Sie dann Ihren JSON deserialisieren, legen Sie den Binder
fest in den JsonSerializerSettings
etwa so:
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Binder = new NamespaceMappingSerializationBinder { FromNamespace = "From Namespace", ToNamespace = "Your Namespace" } };
Die Analyse des Typnamens oben ist extrem grob. Ich habe hier einen viel intelligenteren Parser gefunden:How to parse C# Generic Type Names?. Möglicherweise müssen Sie auch den benutzerdefinierten Binder
erweitern um ein Zuordnungswörterbuch zu haben.
Wenn Sie die Namespace-Namen bei der Serialisierung neu zuordnen müssen und in .Net 4.0 oder höher arbeiten, können Sie auf ähnliche Weise BindToName
überschreiben .