2012-05-10 10 views
7

का उपयोग करते समय रनटाइम में कुछ गुणों को अनदेखा करें I DataMontractSerializer का उपयोग डेटामम्बर विशेषता (केवल सार्वजनिक गुणों को क्रमबद्ध कर रहे हैं) का उपयोग करके XML पर ऑब्जेक्ट को क्रमबद्ध करने के लिए कर रहा हूं।
क्या कुछ गुणों को गतिशील रूप से अनदेखा करना संभव है ताकि उन्हें XML आउटपुट में शामिल नहीं किया जा सके?

उदाहरण के लिए, उपयोगकर्ता को कुछ सूची नियंत्रण में वांछित XML तत्वों का चयन करने की अनुमति देने के लिए और फिर केवल उन तत्वों को क्रमबद्ध करने के लिए उपयोगकर्ता चयनित नहीं हैं जिन्हें चयनित नहीं किया गया है।DataContractSerializer

धन्यवाद

उत्तर

3

सूची परिदृश्य के लिए, शायद सिर्फ एक अलग संपत्ति है, इसलिए बजाय:

[DataMember] 
public List<Whatever> Items {get {...}} 

आपके पास:

public List<Whatever> Items {get {...}} 

[DataMember] 
public List<Whatever> SelectedItems { 
    get { return Items.FindAll(x => x.IsSelected); } 

हालांकि, deserializing कि हो सकता है एक दर्द, क्योंकि आपकी सूची आइटम में फ़ीड करने की आवश्यकता होगी; यदि आपको भी deserialize की जरूरत है, तो आपको एक जटिल कस्टम सूची लिखने की आवश्यकता हो सकती है।


एक दूसरे विचार के रूप में; बस के साथ ऑब्जेक्ट का दूसरा उदाहरण बनाएं, केवल आइटम जिन्हें आप क्रमबद्ध करना चाहते हैं; बहुत ही सरल और प्रभावी:

var dto = new YourType { X = orig.X, Y = orig.Y, ... }; 
foreach(var item in orig.Items) { 
    if(orig.Items.IsSelected) dto.Items.Add(item); 
} 
// now serialize `dto` 

AFAIK, DataContractSerializer सदस्यों की सशर्त क्रमबद्धता का समर्थन नहीं करता।

व्यक्तिगत संपत्ति स्तर पर, यह एक विकल्प यदि आप XmlSerializer, हालांकि उपयोग कर रहे हैं - एक संपत्ति के लिए, कहते हैं, Foo, तो आप सिर्फ जोड़ें:

public bool ShouldSerializeFoo() { 
    // return true to serialize, false to ignore 
} 

या:

[XmlIgnore] 
public bool FooSpecified { 
    get { /* return true to serialize, false to ignore */ } 
    set { /* is passed true if found in the content */ } 
} 

ये पूरी तरह नाम-आधारित सम्मेलन के रूप में लागू होते हैं।

+0

धन्यवाद, मार्क। तो उदाहरण के लिए, यदि मेरे पास सूची का उदाहरण है जहां MyClass के पास तीन गुण X, Y और Z हैं, तो केवल एक्स और वाई गुणों को शामिल करना संभव होगा और सूची में प्रत्येक आइटम के लिए ज़ेड को अनदेखा करना होगा और फिर यह सूची DataContractSerializer को भेजें और धारावाहिक में आउटपुट में केवल एक्स और वाई शामिल होंगे और ज़ेड को अनदेखा करेंगे? मैं सिर्फ सूची में प्रत्येक आइटम के लिए कुछ गुणों को बाहर करना चाहता हूं। क्या आपने ऊपर निर्दिष्ट कुछ विकल्पों के साथ यह संभव है? – Joxi

+1

'X' और' Y' को क्रमबद्ध करने के मामले में, लेकिन 'Z' नहीं; डीसीएस के साथ जो केवल उपलब्ध है (जहां तक ​​मुझे पता है) यदि यह ** ** ** ** पर लागू होता है, यानी '[डेटामेम्बर]' या '[IgnoreDataMember] 'उचित रूप से चुनकर; डीसीएस में मेरे सर्वोत्तम ज्ञान के लिए सशर्त क्रमिकरण नहीं है –

1
+3

यह संकलन-समय है, रन-टाइम नहीं है, और व्यक्तिगत सूची आइटम पर लागू नहीं हो सकता है। –

संबंधित मुद्दे