Форматът на "$type"
е официално твърдо кодиран, за да включва CLR пространството от имена на изпращащата система. Така че можете да:
-
Преименувайте вашите CLR пространства от имена, за да съответстват на тези на изпращащата система, или
-
Подклас
DefaultSerializationBinder
и го използвайте, за да преименувате имената на CLR пространството от имена по време на десериализацията, като го зададете вJsonSerializerSettings.Binder
.
Следното е първата стъпка в това:
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;
}
}
След това, когато десериализирате своя JSON, задайте Binder
в JsonSerializerSettings
така:
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Binder = new NamespaceMappingSerializationBinder { FromNamespace = "From Namespace", ToNamespace = "Your Namespace" } };
Разборът на името на типа в горното е изключително груб. Намерих много по-интелигентен анализатор тук:Как да анализирам имена на общи типове в C#?. Може също да се наложи да разширите персонализирания Binder
за да имате речник на съпоставянията.
По същия начин, ако трябва да пренастроите имената на пространството от имена при сериализация и работите в .Net 4.0 или по-нова версия, можете да замените BindToName
.