Format "$type"
jest oficjalnie zakodowany na sztywno, aby uwzględnić przestrzeń nazw CLR systemu wysyłającego. Możesz więc:
-
Zmień nazwy swoich przestrzeni nazw CLR, aby pasowały do systemu wysyłającego lub
-
Podklasa
DefaultSerializationBinder
i użyj go do zmiany nazw przestrzeni nazw CLR podczas deserializacji, ustawiając je wJsonSerializerSettings.Binder
.
Oto pierwsze cięcie w tym zakresie:
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;
}
}
Następnie, gdy deserializujesz swój JSON, ustaw Binder
w JsonSerializerSettings
tak:
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Binder = new NamespaceMappingSerializationBinder { FromNamespace = "From Namespace", ToNamespace = "Your Namespace" } };
Parsowanie nazw typów w powyższym jest bardzo surowe. Znalazłem o wiele mądrzejszy parser tutaj:Jak przeanalizować nazwy typów ogólnych C#?. Może być również konieczne rozszerzenie niestandardowego Binder
mieć słownik mapowań.
Podobnie, jeśli potrzebujesz ponownie zmapować nazwy przestrzeni nazw podczas serializacji i pracujesz w .Net 4.0 lub nowszym, możesz zastąpić BindToName
.