सवाल .NET वेबएपीआई सीरियलाइजेशन k_BackingField Nastiness


जब मैं निम्नलिखित क्रमबद्ध करता हूं:

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

मुझे यह घृणित गड़बड़ मिलती है:

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

क्या देता है? मैं यह सुंदर कैसे बना सकता हूं? JSON प्रतिक्रियाओं में k_BackingField भी शामिल है


76
2017-09-08 20:50


मूल


इससे मेरी मदद मिली: stackoverflow.com/questions/15388452/... - granadaCoder


जवाब:


डिफ़ॉल्ट रूप से आपको न तो उपयोग करने की आवश्यकता नहीं है [Serializable] न [DataContract] वेब एपीआई के साथ काम करने के लिए।

बस अपना मॉडल छोड़ दें, और वेब एपीआई आपके लिए सभी सार्वजनिक संपत्तियों को क्रमबद्ध करेगी।

केवल अगर आप इसमें शामिल होने के बारे में अधिक नियंत्रण रखना चाहते हैं, तो आप अपनी कक्षा को सजाने के साथ [DataContract] और गुणों के साथ शामिल किया जाना चाहिए [DataMember] (क्योंकि डीसीएस और JSON.NET दोनों इन गुणों को सांस लेते हैं)।

अगर किसी कारण से, आपको इसकी आवश्यकता है [Serializable] आपकी कक्षा पर (यानी आप इसे किसी कारण से स्मृति धारा में क्रमबद्ध कर रहे हैं, गहरी प्रतियां आदि कर रहे हैं), तो आपको बैकिंग फ़ील्ड नामों को रोकने के लिए दोनों विशेषताओं का उपयोग करना होगा:

[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



वह था - मुझे बस [Serializable] को हटाने की जरूरत है। धन्यवाद। - Micah
धन्यवाद फिलिप, कैश की वजह से गुणों को रखना है .. बीटीडब्ल्यू, मैं आपके ब्लॉग का उत्साही प्रशंसक हूं .. इसे आना जारी रखें! - Stephen Patten
हाहा बहुत बहुत धन्यवाद! - Filip W
यह सिर्फ भयानक है। माइक्रोसॉफ्ट क्यों नहीं कर सकता कभी serialization की बात आती है जब कुछ भी सही है? - Chris Marisic
एक और सामान्य समाधान है, जैसा कि मैंने नीचे अपने उत्तर में दिखाया है। - JotaBe


एक और सामान्य समाधान है: आप जेसन सीरियलज़र को अनदेखा करने के लिए कॉन्फ़िगर कर सकते हैं [Serializable] विशेषता, ताकि आपको अपनी कक्षाओं में विशेषताओं को बदलने की आवश्यकता न हो।

आपको एप्लिकेशन कॉन्फ़िगरेशन में यह कॉन्फ़िगरेशन बदलना चाहिए, यानी Global.asax में Application_Start घटना:

var serializerSettings =
  GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
var contractResolver =
  (DefaultContractResolver)serializerSettings.ContractResolver;
contractResolver.IgnoreSerializableAttribute = true;

आप जेसन सीरियलाइजेशन में अन्य बदलाव भी कर सकते हैं, जैसे सीरियलाइजिंग तिथियों के प्रारूपों को निर्दिष्ट करना, और कई अन्य चीजें।

यह केवल वेब एपीआई जेएसओएन क्रमबद्धता पर लागू होगा। ऐप में अन्य serializations (वेब ​​एपीआई एक्सएमएल serialization, एमवीसी JsonResult ...) इस सेटिंग से प्रभावित नहीं होगा।


81
2018-03-18 16:58



इस समाधान ने मुझे दो बार मदद की! और मैं इसे बीच में भूल गया था। - John Gietzen
मुझे यह समाधान हर जगह [DataContract] और [DataMember] विशेषताएँ जोड़ने से बहुत बेहतर लगता है। धन्यवाद!! - Mark Good
बहुत बढ़िया, एक आकर्षण की तरह काम करता है! - Roemer
ऐसा कुछ नहीं जो आपको हर समय इस्तेमाल करना चाहिए, लेकिन यह एक साफ चाल है। एक क्रॉबर की तरह जो आपको गन्दा परिस्थितियों में मदद करने में मदद करती है जहां आपके पास मॉडल बदलने या गहराई में कोडबेस को रीफैक्टर करने की सुविधा नहीं है। - uygar.raf
यदि आप वेब एपीआई का उपयोग कर रहे हैं और नेट फ्रेमवर्क के संस्करण 4 को लक्षित कर रहे हैं तो आपको काम करने के लिए Netwonsoft.Json पैकेज को अपडेट करने की आवश्यकता होगी, यानी Update-Package Newtonsoft.Json। - pblack


अपनी कक्षा को चिह्नित करने के लिए Serializable के बजाय DataContract का उपयोग करने का प्रयास करें। क्यों, इस पर अधिक जानकारी के लिए स्वचालित गुणों को क्रमबद्ध करने पर अच्छा ब्लॉग पोस्ट।


2
2017-09-09 02:22