2012-11-07 24 views
12

मैं एक वर्ग है कि [Serializable] के साथ चिह्नित है की है। जब मैं इसे वेब एपीआई से वापस करता हूं तो फ़ील्ड नाम सभी फंकी हैं।ASP.NET वेब एपीआई और [Serializable] वर्ग

आम तौर पर JSON लौटे

[{"OrderId":797 ... 

JSON वापस भेज दिया गया [Serializable]

[{"<OrderId>k__BackingField":797 ... 

का उपयोग कर मैं इसे serializable कैशिंग के लिए एक BinaryFormatter उपयोग करने के लिए चिह्नित करने के लिए wan't है। कस्टम सीरिएलाइज़र लिखने या एक जुड़वां वर्ग बनाने के लिए कोई अन्य तरीका है जो धारावाहिक नहीं है और दोनों के बीच "कास्ट" में बंदर कोड लिखना है?

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

आप के लिए एक बेहतर समाधान से छुटकारा पाने के किया जा सकता है [Serializable] कुल मिलाकर, का उपयोग बंद:

+0

कैसे द्विआधारी फ़ॉर्मेटर मदद कैशिंग करता है? – DarthVader

+0

ऑर्डर बाहरी सिस्टम से हैं और इन्हें अपने एपीआई के माध्यम से दिनांक शून्य से सभी ऑर्डर प्राप्त करने में 10 सेकंड या इससे अधिक समय लगता है। आखिरी कैश की तारीख और वर्तमान तिथि के बीच ऑर्डर प्राप्त करना बहुत तेज़ है, इसे कैश में स्टोर करें और फिर पूरी सूची लौटाएं। – Malako

+1

यह JSON.net [वेब JSI में उपयोग की जाने वाली डिफ़ॉल्ट JSON क्रमबद्धता लाइब्रेरी] के साथ एक सीमा है। http://stackoverflow.com/questions/10143420/why-does-json-net-serialization-fail-with-serializable-and-a-lambda-inside-a-r - यह देखें। आप JSON.NET के नवीनतम संस्करण का उपयोग करने का प्रयास कर सकते हैं या चीज़ों को कैश करने के लिए कुछ और तरीका ढूंढ सकते हैं। – Suhas

उत्तर

21

तुम बस Json.NET फिर [Serializable] अर्थ विज्ञान की अनदेखी करने के लिए इस एक लाइनर की जरूरत है बाइनरीफॉर्मेटर, और उदाहरण के लिए जेसन.नेट सीरिएलाइज़र की तरह, जो भी कैशिंग करना चाहते हैं, उसे करने के बजाय एक अलग धारावाहिक का उपयोग करें।

+0

धन्यवाद! जेसनफॉर्मेटर के लिए ठीक काम करता है, लेकिन क्या एक और सामान्य तरीका है? मेरे पास जेसन, जेसनपी और एक्सएमएल का अनुरोध करने वाले ग्राहक हैं। – Malako

+1

नहीं, ऐसा नहीं है। प्रत्येक फॉर्मेटर यह चुनने के लिए स्वतंत्र है कि [Serializable] को अपने तरीके से कैसे संभालना है। डिफ़ॉल्ट XmlFormatter [Serializable] को पहचानता है, लेकिन आप इससे बचने के लिए XmlSerializer पर स्विच कर सकते हैं। आप के लिए एक बेहतर समाधान से छुटकारा पाने के हो सकता है [Serializable] कुल मिलाकर, BinaryFormatter का उपयोग बंद, और बदले में एक अलग serializer का उपयोग आप उदाहरण के लिए Json.NET serializer की तरह, क्या करना चाहते हैं जो कुछ भी कैशिंग करने के लिए। –

+1

जैसा कि आपने सुझाव दिया था, मैंने जेसन.NET धारावाहिक का उपयोग कर समाप्त कर दिया। प्रदर्शन बाइनरीफॉर्मेटर जितना अच्छा है और [Serializable] विशेषता के लिए कोई आवश्यकता नहीं है। इसे एक उत्तर में रखें और आपको अपना क्रेडिट मिल जाएगा। धन्यवाद! – Malako