2011-09-12 12 views
12

मैं एक DataContractJsonSerializer उपयोग कर रहा हूँ और DataMember नाम के साथ समस्या है।क्रमबद्धता DataMember (नाम) ओवरराइड मुद्दा

मैं एक आधार वर्ग और कई व्युत्पन्न वर्ग बनाया है। मुझे व्युत्पन्न कक्षाओं की आवश्यकता है क्योंकि मेरे पास अलग-अलग जेसन स्ट्रिंग हैं। मैं जेसन स्ट्रिंग को deserialize करना चाहता हूँ और इसलिए डेटामेम्बर के लिए अलग-अलग नामों की आवश्यकता है। मैं निम्न उदाहरण में DataMember नाम बदलने की कोशिश:

Baseclass:

[DataContract] 
public abstract class BaseClass 
{ 


    [DataMember] 
    public virtual string FirstMethod { get; protected set; } 

} 

व्युत्पन्न वर्ग:

[DataContract] 
[KnownType(typeof(BaseAccess))] 
public class DerivedClass 
{ 


    [DataMember(Name="first_method")] 
    public virtual string FirstMethod { get; protected set; } 

} 

समस्या यह है कि जब मैं एक व्युत्पन्न वर्ग का उपयोग क्रमबद्धता उपेक्षा करने लगता है दिया गया डेटामेम्बर नाम। तो जब मैं DerivedClass प्रकार के साथ deserialize serialization "first_method" (व्युत्पन्न वर्ग के) के बजाय "फर्स्ट मोड" (बेस क्लास के नाम) के साथ होता है। क्या व्युत्पन्न वर्ग के डेटामेम्बर नाम का उपयोग करना संभव है (जो मेरी स्थिति में कई व्युत्पन्न कक्षाओं के लिए अलग है)।

एक और सवाल। मुझे बेस क्लास पर ज्ञात टाउन के साथ उदाहरण मिले और व्युत्पन्न कक्षा में जोड़ा गया। व्युत्पन्न वर्ग (विशेष रूप से विरासत चिंताओं के लिए) पर ऐसा करने के लिए मुझे तर्क लगता है। सही क्या है

उत्तर

7

मैं इस एक ही मुद्दा था। मैं वीबीएनईटी का उपयोग कर रहा था और मुझे अपनी व्युत्पन्न कक्षा में डेटामेम्बर संपत्ति का सम्मान करने के लिए डब्ल्यूसीएफ प्राप्त करने के लिए संपत्ति को छाया (या ओवरलोड) करना पड़ा। सी # में आप नए ऑपरेटर का उपयोग करने में सक्षम होना चाहिए।

public class DerivedClass 
{ 
    [DataMember(Name = "first_method")] 
    new public string FirstMethod { get; protected set; } 
} 
+0

ध्यान रखें कि आपके json में दो क्षेत्रों बनाने से बचने के लिए, आप आधार वर्ग में संपत्ति से [DataMember] विशेषता को दूर करने की आवश्यकता होगी। –

3

चाल आधार वर्ग के आभासी डेटा सदस्य के लिए EmitDefaultValue = false निर्दिष्ट करने के लिए है, और व्युत्पन्न वर्ग वापसी डिफ़ॉल्ट मान में इसके कार्यान्वयन में इतना डेटा सदस्य धारावाहिक नहीं है। व्युत्पन्न कक्षा में आवश्यक नाम के साथ एक और डेटा सदस्य परिभाषित करें।

[DataContract(Name = "baseclass", Namespace = "")] 
[KnownType(typeof(DerivedClass))] 
public class BaseClass 
{ 
    [DataMember(Name = "attributes", EmitDefaultValue = false)] 
    public virtual SomeType Fields { get; set; } 
} 

[DataContract(Name = "derivedclass", Namespace = "")] 
public class DerivedClass : BaseClass 
{ 
    public override SomeType Fields 
    { 
     get { return null; } 
    } 

    [DataMember(Name = "fields")] 
    public SomeType DerivedFields 
    { 
     get { return base.Fields; } 
    } 
} 
संबंधित मुद्दे