2011-05-27 15 views
7

पर किसी विशिष्ट प्रकार के गुणों को बहिष्कृत करें, मुझे लगता है कि जेसन.NET लाइब्रेरी का उपयोग करके क्रमबद्ध होने से दिए गए प्रकार (ओं) (या उनमें से संग्रह) के कुछ गुणों को बाहर/अलग करने के लिए कैसे सोच रहा है? मैंने अपना खुद का अनुबंध रिज़ॉल्वर लिखने की कोशिश की (से डिफॉल्ट कंट्रैक्ट रिसेल्वर) कोई भाग्य नहीं है।JSON.NET - रनटाइम

मुझे पता है कि मैं DataAnnotations का उपयोग किया जा सकता है, साथ सजाने बाहर रखा गुण ScriptIgnoreAttribute, लेकिन यह मेरी स्थिति में लागू नहीं है। धारावाहिक वस्तुओं को वस्तुतः कुछ भी हो सकता है, इसलिए मुझे नहीं पता कि कौन से गुण डिज़ाइन-टाइम पर बहिष्कृत किए जाएंगे। मुझे केवल प्रकार गुणों के बारे में पता है जिन्हें धारावाहिक नहीं किया जाना चाहिए।

यह एक नहीं बल्कि सरल कार्य की तरह दिखता है, लेकिन दुर्भाग्य से मैं एक सभ्य समाधान कहीं भी नहीं मिला ...

Btw - आसानी से अगर यह कर सकते हैं - मैं Json.NET पुस्तकालय करने के लिए बाध्य नहीं कर रहा हूँ डिफ़ॉल्ट/अन्य .NET JSON serializers के साथ किया जाना चाहिए यह मेरे लिए एक समान समाधान होगा।

अद्यतन

गुण उन्हें क्रमानुसार करने की कोशिश कर रहा से पहले बाहर रखा जाना चाहिए। क्यों?

असल में, मुझे प्राप्त होने वाली वस्तुओं के प्रकार और क्रमबद्ध करने में IDynamicMetaObjectProvider से प्राप्त प्रकार के गतिशील गुण हो सकते हैं। मैं सभी विवरण वर्णन करने के लिए नहीं जा रहा हूँ, लेकिन DynamicMetaObject इन वस्तुओं में से GetMetaObject विधि से लौटे DynamicMetaObject.GetDynamicMemberNames विधि लागू नहीं है (NotImplementedException फेंकता है ...)। संक्षेप में - समस्या उन वस्तुओं (मुझे बहिष्कृत करने की आवश्यकता है) उनकी गुणों को की गणना करने की अनुमति नहीं देती है, जो जेसन.नेट सीरिएलाइज़र दृश्यों के पीछे क्या करने की कोशिश करता है। मैं हमेशा के साथ समाप्त नहीं हुआ IFplementedException फेंक दिया जा रहा है।

+0

तो, स्पष्टीकरण के लिए, आप धारावाहिक गुणों से बाहर निकलना चाहते हैं जिनके मूल्य 'IDynamicMetaObjectProvider' को लागू करते हैं? मैं गतिशील प्रकारों से बहुत परिचित हूं, लेकिन मैं आपके मामले में अनिश्चित हूं कि वास्तव में आप क्या कर रहे हैं। ऐसा लगता है कि आप सामान्य कक्षाओं को क्रमबद्ध कर रहे हैं और इन पर कुछ गुणों को बाहर करना चाहते हैं जो गतिशील उदाहरणों को संदर्भित करते हैं। साथ ही आप यह भी संकेत देते हैं कि आप उन वस्तुओं के प्रकार, या आधार प्रकारों को नहीं जानते हैं, जिन्हें आप क्रमबद्ध कर रहे हैं - बस वे कभी-कभी उन गुणों का संदर्भ देते हैं जो गतिशील होते हैं और क्रमबद्ध नहीं किए जा सकते हैं। कृपया एक साधारण उदाहरण पोस्ट करें। –

+0

बिल्कुल यही! जिस रूट ऑब्जेक्ट को मैं क्रमबद्ध कर रहा हूं वह कुछ भी हो सकता है, लेकिन कभी-कभी इसमें गतिशील प्रॉपर्टी हो सकती है (जो कुछ IDynamicMetaObjectProvider ऑब्जेक्ट का संदर्भ देता है, या कुछ संग्रह), जिसे मैं क्रमबद्धता से बाहर करना चाहता हूं। सीरियलाइज्ड ऑब्जेक्ट गतिशील नहीं है, केवल बहिष्कृत संपत्ति/ies हैं। –

+0

क्या यह खाली गुणों के रूप में उन्हें क्रमबद्ध करने के बजाय इन गुणों को पूरी तरह से बाहर करने की आपकी आवश्यकता के लिए पर्याप्त नहीं है? तो फू नाम की एक संपत्ति जिसका उदाहरण गतिशील है उसे फू के रूप में क्रमबद्ध किया जाएगा: {} –

उत्तर

5

मैंने डब्ल्यूसीएफ जेएसओएन क्रमबद्धता के साथ-साथ System.Web.Script.Serialization.JavaScriptSerializer दोनों की कोशिश की है। मैंने पाया है कि क्या आप धारावाहिक प्रक्रिया के ठोस नियंत्रण चाहते हैं और चीजों को काम करने के लिए विशेषताओं और हैक्स द्वारा बाध्य नहीं होना चाहते हैं, JavaScriptSerializer जाने का रास्ता है। इसे .NET स्टैक में शामिल किया गया है और आपको JavaScriptConverter उप-वर्गों को प्रकार के कस्टम क्रमबद्ध करने के लिए बनाने और पंजीकरण करने की अनुमति देता है।

मुझे लगता है कि एकमात्र प्रतिबंध आपको समस्या का कारण बन सकता है कि आप Object (उर्फ, उन सभी पर शासन करने के लिए एक कनवर्टर) के सभी उप-वर्गों को परिवर्तित करने के लिए आसानी से कनवर्टर पंजीकृत नहीं कर सकते हैं। आपको वास्तव में असेंबली स्कैन करके सामान्य आधार वर्गों का ज्ञान होना चाहिए या आगे के प्रकारों के सेट को पूर्व-निर्धारित करना होगा। हालांकि, संपत्ति क्रमबद्धता पूरी तरह से आपके लिए छोड़ी गई है, इसलिए आप सरल प्रतिबिंब का उपयोग करने का निर्णय ले सकते हैं, जो गुणों को क्रमबद्ध करने और कैसे करें।

प्लस, डिफ़ॉल्ट सीरियलाइजेशन डब्ल्यूसीएफ दृष्टिकोण की तुलना में JSON के लिए बहुत बेहतर है। डिफ़ॉल्ट रूप से, सभी प्रकार गुणों के बिना क्रमबद्ध होते हैं, नाम से क्रमबद्ध enums, स्ट्रिंग-कुंजी शब्दकोश JSON ऑब्जेक्ट्स के रूप में serialize, सरणीकरण सरणी के रूप में serialize, आदि। लेकिन स्पष्ट कारणों के लिए, जैसे परिपत्र पेड़, यहां तक ​​कि डिफ़ॉल्ट व्यवहार भी समय से सहायता की जरूरत है पहर।

मेरे मामले में, मैं क्लाइंट-एपीआई का समर्थन कर रहा था जो सर्वर क्लास स्ट्रक्चर से बिल्कुल मेल नहीं खाता था, और हम आंखों पर एक आसान जेएसओएन सिंटैक्स चाहते थे, और JavaScriptSerializer ने हर बार चाल की थी। अगर आपको शुरू करने के लिए कुछ कोड नमूने चाहिए तो बस मुझे बताएं।

+0

@Jamie को बाहर करने के लिए सटीक प्रकार पता हैं: जानकारी के लिए धन्यवाद, लेकिन दुर्भाग्य से मैं डिज़ाइन समय पर * सीरियलाइज्ड * ऑब्जेक्ट का सटीक प्रकार नहीं जान सकता, क्योंकि वे कुछ भी हो सकते हैं। मुझे केवल सटीक प्रकार पता है कि * धारावाहिक नहीं किया जाना चाहिए * –

+0

क्या आपको .NET ढांचे में पाए गए सभी प्रकारों के लिए कस्टम क्रमिकरण करने की आवश्यकता है, या केवल अपनी परियोजनाओं या असेंबली में टाइप करें जिन्हें आप संदर्भित कर रहे हैं। यदि बाद में, आप आसानी से अपने असेंबली में सभी प्रकार के कन्वर्टर्स पंजीकृत कर सकते हैं (आपके चयन के कम बहिष्करण)। यह असेंबली जैसी कुछ गुजरने के रूप में सरल हो सकता है। GetTypes()। पंजीकरण प्रक्रिया के दौरान कहां (टी => टी। आईएस क्लास)। –

+0

@ जैमी: एप्लिकेशन में एक मॉड्यूलर संरचना है, इसलिए असेंबली जिनसे ऑब्जेक्ट आते हैं उन्हें रनटाइम पर जोड़ा/हटाया जा सकता है। बीटीडब्ल्यू यह सभी असेंबली स्कैन करने और सरल जेएसओएन क्रमबद्ध करने के लिए सभी प्रकारों को इकट्ठा करने के लिए एक ओवरकिल की तरह दिखता है। –

2

अपना खुद का अनुबंध रिज़ॉल्वर बनाएं, उस ऑब्जेक्ट के लिए गुण बनाता है जो उस विधि को ओवरराइड करें और उसके बाद परिणामों को केवल उन लोगों को शामिल करें जिन्हें आप चाहते हैं।

+0

धन्यवाद। मैंने कोशिश की है, लेकिन इसे काम करने के लिए नहीं मिल सका क्योंकि मुझे कुछ गुणों को बाहर करने की आवश्यकता है ** ** सीरिएलाइज़र से पहले भी उनका निरीक्षण करने की कोशिश करता है। कुछ गतिशील वस्तुओं को जिन्हें मुझे बाहर करने की आवश्यकता है, वे अपने सदस्यों की गणना करने की अनुमति नहीं देते हैं और यदि आप कोशिश करते हैं तो अपवाद फेंक देते हैं। तो परिणाम फ़िल्टर करना काम नहीं करेगा ... मैंने तदनुसार प्रश्न अपडेट किया है। –

-1

क्या आपने ShouldSerialize उपसर्ग संपत्ति का उपयोग करके अपने विशिष्ट प्रकार की संपत्ति को रनटाइम पर बाहर करने के लिए उपयोग किया है?

public class Employee 
{ 
    public string Name { get; set; } 
    public Employee Manager { get; set; } 

    public bool ShouldSerializeManager() 
    { 
    return (Manager != this); 
    } 
} 
+0

हां, लेकिन दुर्भाग्य से यह मेरी समस्या का समाधान नहीं किया। यह कुछ मनमानी वस्तु (डिजाइन समय पर ज्ञात नहीं) के कुछ गुणों (उनके प्रकार के आधार पर) चुनने में सक्षम नहीं था और उनको क्रमबद्ध करने से बाहर कर दिया गया था। मैं केवल उन प्रकारों को जानता था जिन्हें क्रमबद्ध नहीं किया जाना चाहिए, और कुछ नहीं। –