Deserialize जब j__ से k__BackingField को कैसे हटाएं


104

मैं एक xml फ़ाइल को .net c # ऑब्जेक्ट में क्रमांकित करने के बाद अपने लौटे हुए json में k_BackingField प्राप्त कर रहा हूं।

मैंने .net c # ऑब्जेक्ट में DataContract और DataMember विशेषता जोड़ी है, लेकिन फिर मुझे json, क्लाइंट एंड पर कुछ भी नहीं मिलता है।

[XmlRoot("person")]
[Serializable]
public class LinkedIn
{
    [XmlElement("id")]
    public string ID { get; set; }

    [XmlElement("industry")]
    public string Industry { get; set; }

    [XmlElement("first-name")]
    public string FirstName { get; set; }

    [XmlElement("last-name")]
    public string LastName { get; set; }
    [XmlElement("headline")]
}

लौटे हुए जोंस का उदाहरण:

home: Object
<FirstName>k__BackingField: "Storefront"
<LastName>k__BackingField: "Doors"

जवाबों:


45

स्वचालित संपत्ति सिंटैक्स वास्तव में अनुशंसित नहीं है यदि वर्ग को क्रमांकन में उपयोग किया जा सकता है। कारण बैकिंग फ़ील्ड संकलक द्वारा उत्पन्न होता है जो अलग-अलग हो सकता है प्रत्येक बार कोड संकलित किया जाता है। यदि वर्ग में कोई परिवर्तन नहीं किया गया है, तो भी यह असंगतता का कारण बन सकता है (केवल कोड को फिर से जमा करना)।

मुझे लगता है कि DataMember विशेषता को लागू करने से इस मामले में समस्या ठीक हो जाएगी। लेकिन मैं पूरी संपत्ति सिंटैक्स का उपयोग करने की सिफारिश करूंगा, अगर वर्ग को क्रमांकन में उपयोग करने की आवश्यकता है।


Lol, लंबे संस्करण लागू किया है और यह client.home करने के लिए निजी क्षेत्रों सेट: ऑब्जेक्ट _fName: "स्टोरफ्रंट" _headline: "सीईओ StorefrontDoors.NET पर" _ id: "" _industry: ""
ढेर भरने मैं क्या है

21
वर्ग के शीर्ष पर उस डाटाकंट्रेक्ट को जोड़ना और काम करने में दिलचस्पी रखने वाली प्रत्येक संपत्ति को डेटामेम्बर करना।
स्टैक भरना है जो मैं करता हूं

3
@ AlumCloud.Com +1 के लिए [DataContract] और [DataMember]। जोड़ना न भूलें: System.Runtime.Serialization
Ian Newland

109

[Serializable]अपनी कक्षा से निकालें


2
अब मैं सोच रहा हूं कि मुझे क्यों लगा कि मुझे पहली जगह में [सीरियल करने योग्य] की आवश्यकता है। मेरा Xml क्रमांकन बिना काम करता है और JSON इसके बिना काम करता है।
राशियस

11
यह WCF सेवाओं के साथ काम नहीं करता है। यदि आप [Serializable] को हटाते हैं तो Restful सेवाओं का उपयोग करके कोई पेलोड लौटाता है तो इससे कोई डेटा प्राप्त नहीं होता है। जोड़ें System.Runtime.Serialization और उपयोग करें [DataContract] वर्ग के लिए, [DataMember] गुणों के लिए।
इयान न्यूलैंड

यह जवाब और इयान टिप्पणी दोनों मामलों को कवर करने के लिए लगता है। डब्ल्यूसीएफ के लिए या डब्ल्यूसीएफ के लिए नहीं, यह सवाल है।
ग्रानैडकोडर

1
@Rhyous - वेब API में आपको [Serializable] की आवश्यकता नहीं है, क्योंकि वेब API की स्थापना इस धारणा के साथ की जाती है कि आप अपनी वस्तुओं को क्रमबद्ध और वापस कर रहे हैं (क्योंकि यह मूल रूप से संपूर्ण विचार है) - अन्य C # अनुप्रयोगों में आप आमतौर पर क्रमिक वस्तुओं को विभेदित करने के लिए सीरियल की जरूरत है
जॉन स्टोरी

धन्यवाद, मैं के साथ फंस गया था [Serializable], इसलिए समर्थन क्षेत्रों को जोड़ने में मदद मिली।
ओमहुसमा

59

डिफ़ॉल्ट WebApi धारावाहिक निर्माता जोड़ देगा कि "__BackingField:" सिंटैक्स से c # ऑटो-गुण। क्लीनर दिखने वाले जोंस को पाने के लिए App_Start में अपने WebConfig में इसे जोड़ें जिसे आप ढूंढ रहे होंगे।

using Newtonsoft.Json;
...

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();

3
इससे समस्या ठीक हो गई। मुझे लगता है कि ऑटो गुण साफ हैं। हर जगह बैकिंग फ़ील्ड का उपयोग करना मूर्खतापूर्ण लगता है। और बहुत सी अव्यवस्था और कभी-कभी भ्रम का परिचय देता है।
रोमेश डी। निरैला

इसने मेरे लिए काम किया। मेरे मामले में, मेरे पास एक मौजूदा वर्ग था जो पहले से ही डब्ल्यूसीएफ और एएसएमएक्स वेबसर्विस द्वारा उपयोग किया जा रहा था, इसलिए मैं इसे अपने नए वेबएपीआई प्रोजेक्ट के लिए बदल नहीं सका।
samiup

4
सवाल यह है कि धरती पर WebApi सीरीज़ियर डिफ़ॉल्ट रूप से "__BackingField:" क्यों जोड़ देगा?
तेमन शिपाही

अच्छा समाधान। मेरे मामले में, मुझे मेमरी में सहेजने के लिए [सीरियल करने योग्य] का उपयोग करने की आवश्यकता है। सीरियल की आवश्यकता है।
5nh Nguyễn Quang

2
मैं StackOverflow के बिना क्या करूँगा? धन्यवाद।
कैमैनक

35

हमारे पास कुछ वस्तुएं हैं, जिन्हें चिह्नित किया जाता है, [Serializable]ताकि उन्हें पारंपरिक तरीकों का उपयोग करके क्रमबद्ध किया जा सके, लेकिन हमें वेब एपीआई के साथ उपयोग के लिए JSON में साफ-सुथरी धारावाहिक बनाना होगा। स्थापना IgnoreSerializableAttributeकरने के लिए trueमाइक्रोसॉफ्ट के serialisers की तरह बर्ताव कर से Newtonsoft.Json बंद हो जाएगा और इसके बजाय यह सिर्फ सार्वजनिक गुण serialise होगा।

TLDR: इसे WebApiConfig.cs में जोड़ें:

((Newtonsoft.Json.Serialization.DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true;

मॉडरेटर: कई बार पूछे गए प्रश्न के बहुत अच्छे उत्तर को हटाने के बजाय, कृपया डुप्लिकेट प्रश्न को हटा दें। यह एक वैध प्रश्न का एक मान्य उत्तर है।


3
यह सही उत्तर होना चाहिए। सीरियलाइज़ेशन को हटाना या डिटैक्टरट्रैक और डेटामैम्बर विशेषताओं का उपयोग करना हमेशा सही समाधान नहीं होता है।
गृहस्वाम हमदान

हम में से बहुत से लोग शामिल नहीं हैं, जिनमें ओपी शामिल है, वेबैपी या एमवीवीएम का उपयोग करना या कभी भी यह आप लोगों के बारे में है। जब मैं एक सामान्य साबुन WCF सेवा के साथ सेवा। Svc है, तो app_start और webapiconfig क्या है?
क्रिश्चियन

10

सरल और आसान तरीका डेटा को उजागर करने के लिए हमें आसान पठनीय और सुसंगत प्रारूप में डेटा को उजागर करने की आवश्यकता है


पहले हटाएं [सीरियल योग्य]

    [Serializable]

अब वर्ग में [DataContract] और [DataMember] नीचे उदाहरण की तरह संपत्ति के लिए जोड़ें

[DataContract]
public class UserDiscretion : UserReport
{
    [DataMember]
    public String DiscretionCode { get; set; }
    public String DiscretionDescription { get; set; }
}

आशा है कि यह मदद
धन्यवाद।


1
यदि वेब API का उपयोग किया जाता है, तो DataContract और DataMember विशेषताओं को जोड़ने की कोई आवश्यकता नहीं है - बस ऑब्जेक्ट वापस करें और यह स्वचालित रूप से क्रमबद्ध हो जाएगा।
जॉन स्टोरी

यदि किसी ने खरोंच से विकास शुरू किया है, तो यह वेब एपीआई का उपयोग करने के लिए बहुत अच्छा होगा जो ऑब्जेक्ट रिटर्न प्रकार प्रदान करेगा, ग्राहक को उजागर करने के लिए किसी भी प्रकार के कास्टिंग की आवश्यकता नहीं होगी। लेकिन @ AlumCloud.com प्रश्न के लिए, यदि वह मौजूदा एप्लिकेशन में है, तो उसकी समस्या का समाधान पहले हटाएं [Serializable] द्वारा किया जाएगा, फिर कक्षा में [DataContract] और नीचे दी गई संपत्ति के लिए [DataMember] जैसा कि सुझाया गया है
नागपाल उपवंशी

1
यह आपकी कक्षाओं में जबरदस्त "शोर" जोड़ता है और अनिवार्य रूप से अनावश्यक है (अन्य सभी टिप्पणियाँ देखें)। यदि किसी को वास्तव में ऐसा करने की आवश्यकता महसूस होती है, हालांकि, मैं संकलन के दौरान आपके लिए कोड जोड़ने के लिए PostSharp जैसी किसी चीज़ का उपयोग करने की सलाह दूंगा ताकि यह उन सभी विशेषताओं के साथ आपकी कक्षाओं को अव्यवस्थित न करे।
कैमैनक

7

विकल्पों की जोड़ी:

  1. [Serializable]मॉडल से निकालें

  2. जोड़ें [DataContract]और[DataMember]अपने मॉडल के साथ [Serializable]

  3. नीचे लाइन में जोड़ें App_Start/WebApiConfig.cs

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();

3

एक और समाधान जो JSON.NET के मामले में मदद कर सकता है। यह [Newtonsoft.Json.JsonObject] विशेषता के साथ वर्ग को चिह्नित करने के लिए पर्याप्त हो सकता है।

मैं xsd से निर्मित सीएस कक्षाओं के साथ काम कर रहा था और आंशिक कक्षाओं का उपयोग करके कुछ गुणों को जोड़ रहा था। Json क्रमांकन के बाद इन गुणों को k_BackingField के साथ चिह्नित किया गया था। अन्य उत्तरों में उल्लिखित JsonFormatter सेटिंग्स ने भी मदद की, लेकिन अधिक सरल [JsonObject] विशेषता के साथ आंशिक वर्ग को चिह्नित करना था।


2

मैं DataContractJsonSerializerएक और विधानसभा से एक वर्ग के साथ उपयोग कर रहा था जिसमें Serializableविशेषता थी। आउटपुट में "k__BackingField" था। निकाला जा रहा है Serializableविशेषता (अन्य विधानसभा में) इस तय की। यकीन नहीं है कि क्यों।


0

यह मानकर कि आप अपने MVC प्रोजेक्ट के अंदर इस समस्या को देखते हैं, मैंने पाया है कि @ Html.JsonData के उपयोग को बदलना बहुत आसान है। यहाँ कोड का एक टुकड़ा है जो मेरे लिए अतीत में काम कर चुका है:

<input type="hidden" id="Model" value="@Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model))" />

चुटकी में सुरुचिपूर्ण नहीं, बल्कि सरल।


0

मेरे पास यह मुद्दा था जब मेरी कक्षा में आत्म संदर्भ गुण हैं जैसे;

class Person {
 List<Person> Friends { get; set;}
}

और एक परिणाम था, व्यक्ति स्वयं के साथ दोस्त था। मैंने अभी यह सुनिश्चित किया है कि मेरे परिणाम सेट में कोई आत्म सन्दर्भित वस्तु न हो। उम्मीद है की यह मदद करेगा।


0

मुझे [Serializable] विशेषताओं का उपयोग करना था, इसलिए इसे हटाना एक विकल्प नहीं था।

WebApi में XmlSerializer [XmlAttribute] को अनदेखा करता है

उपरोक्त संकल्प ने इसे मेरे लिए हल कर दिया।

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

0

मेरे मामले में यह त्रुटि Newtonsoft.Json संस्करण के लिए थी, सर्वर ने 6.0.0 संस्करण की तलाश की और मेरे पास 11.0 था, इसलिए मुझे संस्करण 6.0.0 स्थापित करना पड़ा


-2

मित्रों, इस तरह से गुणों की घोषणा न करें:

public String DiscretionCode { get; set; }
public String DiscretionDescription { get; set; }

लेकिन, पुराने जैसे, पुराने संस्करण बनाएँ ...।

private String discretionCode;

public String DiscretionCode 
{ 
    get { return discretionCode;}
    set { discretionCode = value; }
}

1
क्यों? क्या आप एक प्रतिध्वनि दे सकते हैं?
ल्यूसेंटी जूल

@ इस तरह से यह JSON देता है .. [{"discreationCode": "x"}], जब क्रमबद्ध किया जा रहा हो।
बजे अम्मार अमीरदेने

लेकिन यह वही है जो मैं उम्मीद करूंगा - यह JSON डेटा कैसे अनुक्रमित करता है। और मुझे लगता है कि ऑक्जेलिव वर्जन वाला कोड समान परिणाम देगा।
ल्यूसेंटी सेप

k_BackingField को जोड़ा गया है ताकि यह इंगित किया जा सके कि एक ऑटो-प्रॉपर्टी को क्रमबद्ध किया गया है। यदि आप ऑटो-प्रॉपर्टी को किसी प्रॉपर्टी और बैकिंग फील्ड में रिफ्लेक्टर करते हैं तो समस्या दूर हो जाएगी। मुझे लगता है कि इस धागे में बेहतर समाधान हैं लेकिन यह काम करता है।
टाइमबी ३३
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.