Định dạng của "$type"
được mã hóa cứng chính thức để bao gồm không gian tên CLR của hệ thống gửi. Vì vậy, bạn có thể:
-
Đổi tên không gian tên CLR của bạn để phù hợp với không gian tên của hệ thống gửi hoặc
-
Phân lớp
DefaultSerializationBinder
và sử dụng nó để đổi tên không gian tên CLR trong quá trình giải mã bằng cách đặt nó trongJsonSerializerSettings.Binder
.
Sau đây là phần đầu tiên khi thực hiện việc này:
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;
}
}
Sau đó, khi bạn giải mã JSON của mình, hãy đặt Binder
trong JsonSerializerSettings
như vậy:
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Binder = new NamespaceMappingSerializationBinder { FromNamespace = "From Namespace", ToNamespace = "Your Namespace" } };
Phân tích cú pháp tên kiểu ở trên là cực kỳ thô thiển. Tôi đã tìm thấy một trình phân tích cú pháp thông minh hơn nhiều ở đây:Làm thế nào để phân tích cú pháp tên loại chung C # ?. Bạn cũng có thể cần mở rộng Binder
tùy chỉnh để có một từ điển về ánh xạ.
Tương tự, nếu bạn cần ánh xạ lại các tên không gian tên khi tuần tự hóa và đang hoạt động trong .Net 4.0 trở lên, bạn có thể ghi đè BindToName
.