Câu hỏi .NET WebAPI Serialization k_BackingField Nastiness


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


76
2017-09-08 20:50


gốc


Điều này đã giúp tôi: stackoverflow.com/questions/15388452/… - granadaCoder


Các câu trả lời:


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; }
}

113
2017-09-10 20:46



Đó là nó - tôi chỉ cần loại bỏ [Serializable]. Cảm ơn. - Micah
Cảm ơn Filip, phải giữ các thuộc tính vì bộ nhớ đệm .. BTW, tôi là một fan hâm mộ cuồng nhiệt của blog của bạn .. giữ nó đến! - Stephen Patten
haha cảm ơn rất nhiều! - Filip W
Điều này thật khủng khiếp. Tại sao không thể Microsoft KHÔNG BAO GIỜ làm bất cứ điều gì chính xác khi nói đến serialization? - Chris Marisic
Có một giải pháp tổng quát hơn, như tôi trình bày trong câu trả lời của riêng tôi dưới đây. - JotaBe


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.


81
2018-03-18 16:58



Giải pháp này đã giúp tôi ... hai lần! Và tôi đã quên nó ở giữa. - John Gietzen
Tôi thích giải pháp này tốt hơn rất nhiều so với việc thêm thuộc tính [DataContract] và [DataMember] ở mọi nơi. Cảm ơn bạn!! - Mark Good
Tuyệt vời, hoạt động như một sự quyến rũ! - Roemer
Không phải cái gì bạn nên sử dụng tất cả các thời gian, nhưng đây là một thủ thuật gọn gàng. Một loại xà beng giúp bạn có được những tình huống lộn xộn, nơi bạn không có sự thay đổi về các mô hình hoặc tái cấu trúc mã nguồn theo chiều sâu. - uygar.raf
Nếu bạn đang sử dụng api web và đang nhắm mục tiêu phiên bản 4 của khung .net thì bạn sẽ cần phải cập nhật gói Netwonsoft.Json để làm việc này, tức là Update-Package Newtonsoft.Json. - pblack


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.


2
2017-09-09 02:22