.NET WebAPI सीरियलाइज़ेशन k_BackingField Nastiness


86

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

[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 भी होता है


इससे मुझे मदद मिली: stackoverflow.com/questions/15388452/…
granadaCoder

जवाबों:


126

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

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

केवल अगर आप इसमें शामिल हैं के बारे में अधिक नियंत्रण रखना चाहते हैं, तो आप अपनी कक्षा को [DataContract]और गुणों को शामिल करने के लिए [DataMember]सजायें (क्योंकि DCS और 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; }
}

6
वह यह था - मुझे बस [Serializable] को हटाने की आवश्यकता थी। धन्यवाद।
मीका

धन्यवाद फ़िलिप, कैश के कारण विशेषताओं को रखना है .. BTW, मैं आपके ब्लॉग का शौक़ीन हूँ। इसे जारी रखें!
स्टीफन पैटन

20
यह सिर्फ भयानक है। जब क्रमबद्धता की बात आती है तो Microsoft कभी भी कुछ भी सही नहीं कर सकता है ?
क्रिस मैरिकिक

एक और सामान्य समाधान है, जैसा कि मैं नीचे अपने जवाब में दिखाता हूं।
जटबे

शायद क्रमबद्धता के साथ समस्या "सही" की परिभाषा है, हर किसी को अपने तरीके से डेटा की आवश्यकता होती है।
लुइज़ फेलिप

94

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

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

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

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

यह केवल वेब API JSON क्रमांकन पर लागू होगा। एप्लिकेशन में अन्य क्रमबद्धताएं (वेब ​​API XML क्रमांकन, MVC JsonResult ...) इस सेटिंग से प्रभावित नहीं होंगी।


4
मुझे हर जगह [DataContract] और [DataMember] विशेषताओं को जोड़ने की तुलना में यह समाधान बहुत अच्छा लगता है। धन्यवाद!!
मार्क गुड

1
कुछ ऐसा नहीं है जो आपको हर समय उपयोग करना चाहिए, लेकिन यह एक साफ चाल है। एक प्रकार का मुकुट जो आपको गन्दी परिस्थितियों में पहुँचाने में मदद करता है जहाँ आपके पास मॉडल बदलने या कोडबेस को गहराई से पुनः प्राप्त करने का विलास नहीं है।
uygar.raf

आप सही हैं कि यह ऐसा करने का सबसे अच्छा तरीका नहीं है। हालाँकि, कुछ अवसरों पर यह न केवल एक लक्जरी है, लेकिन यह बिल्कुल संभव नहीं है। उदाहरण के लिए, यदि कोडबेस WCF, या XML Serialization का उपयोग करता है, तो उसे डेटा अनुबंध या XML क्रमांकन विशेषताओं की आवश्यकता होती है। आप उसे बदल नहीं सकते। सौभाग्य से JSON.NET बहुत शक्तिशाली है: यह डेटा कॉन्ट्रैक्ट, XML क्रमांकन और अपनी विशेषताओं का समर्थन करता है, और आप इसे नियंत्रित कर सकते हैं कि यह कैसे उन्हें क्रमांकन के लिए उपयोग करता है, या यहां तक ​​कि उन्हें पूरी तरह से अनदेखा करने के लिए। और आप अपना खुद का कार्यान्वयन भी जोड़ सकते हैं। बेशक, मैं बिना विशेषताओं के साफ क्लैस रखने का पूर्वाभास करता हूं।
कोटाबेटे

यह डिफ़ॉल्ट रूप से कैसे काम करना चाहिए! हम अपनी धारावाहिक धारावाहिक में वेव बैकिंगफील्ड बकवास क्यों करते हैं?
बायरन व्हिटलॉक

1
यदि आप वेब एपीआई का उपयोग कर रहे हैं और .net फ्रेमवर्क के संस्करण 4 को लक्षित कर रहे हैं तो आपको नेटवांसॉफ्ट.जॉन पैकेज को अपडेट करने की आवश्यकता होगी ताकि यह काम कर सके Update-Package Newtonsoft.Json
9

2

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.