Khi tôi sắp xếp theo thứ tự sau:
[Serializable]
public class Error
{
public string Status { get; set; }
public string Message { get; set; }
public string ErrorReferenceCode { get; set; }
public List<FriendlyError> Errors { get; set; }
}
Tôi nhận được mớ hỗn độn kinh tởm này:
<ErrorRootOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Printmee.Api">
<_x003C_Errors_x003E_k__BackingField>
An exception has occurred. Please contact printmee support
</_x003C_Errors_x003E_k__BackingField>
<_x003C_LookupCode_x003E_k__BackingField>988232ec-6bc9-48f3-8116-7ff7c71302dd</_x003C_LookupCode_x003E_k__BackingField>
</ErrorRootOfstring>
Đưa cái gì? Làm thế nào tôi có thể làm cho điều này đẹp? Phản hồi JSON cũng chứa k_BackingField
Theo mặc định, bạn không cần sử dụng cả hai [Serializable]
cũng không [DataContract]
để làm việc với API Web.
Chỉ cần rời khỏi mô hình của bạn và API Web sẽ tuần tự hóa tất cả các thuộc tính công khai cho bạn.
Chỉ khi bạn muốn kiểm soát nhiều hơn về những gì được bao gồm, sau đó bạn trang trí lớp học của mình [DataContract]
và các thuộc tính được đưa vào [DataMember]
(vì cả DCS và JSON.NET đều chỉnh sửa các thuộc tính này).
Nếu vì một lý do nào đó, bạn cần [Serializable]
trên lớp học của bạn (tức là bạn đang tuần tự hóa nó vào luồng bộ nhớ vì lý do nào đó, thực hiện các bản sao sâu vv), thì bạn phải sử dụng cả hai thuộc tính kết hợp để ngăn các tên trường sao lưu:
[Serializable]
[DataContract]
public class Error
{
[DataMember]
public string Status { get; set; }
[DataMember]
public string Message { get; set; }
[DataMember]
public string ErrorReferenceCode { get; set; }
[DataMember]
public List<FriendlyError> Errors { get; set; }
}
Có một giải pháp tổng quát hơn: bạn có thể cấu hình Json Serializer để bỏ qua [Serializable]
để bạn không phải thay đổi các thuộc tính trong các lớp của bạn.
Bạn nên thực hiện thay đổi cấu hình này trong ứng dụng bắt đầu, tức là trong Global.asax Application_Start
biến cố:
var serializerSettings =
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
var contractResolver =
(DefaultContractResolver)serializerSettings.ContractResolver;
contractResolver.IgnoreSerializableAttribute = true;
Bạn cũng có thể thực hiện các thay đổi khác đối với việc tuần tự hóa Json, như chỉ định các định dạng để tuần tự hóa ngày và nhiều thứ khác.
Điều này sẽ chỉ áp dụng cho việc tuần tự hóa JSON Web API. Các serialization khác trong ứng dụng (Web API XML serialization, MVC JsonResult ...) sẽ không bị ảnh hưởng bởi thiết lập này.
Hãy thử sử dụng DataContract thay vì Serializable để đánh dấu lớp học của bạn. Để biết thêm chi tiết về lý do, hãy xem bài đăng trên blog tốt về tuần tự hóa các thuộc tính tự động.