2010-07-29 16 views
5

मैं इसक्या मैं एक विशिष्ट डेटामबर्ग को deserialized से रोक सकता हूँ?

[DataContract] 
class MyDC 
{ 
    [DataMember] 
    public string DM1; 

    [DataMember] 
    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

और कभी कभी मैं जब एक OperationContract से लौटाए जाने deserialized होने से DM2 रोकना चाहते हैं, की तरह एक datacontract है। कुछ इस तरह:

[OperationContact] 
public MyDC GetMyDC() 
{ 
    MyDC mdc = new MyDC(); 

    if (condition) 
    { 
     // Code to prevent DM2 from being deserialized 
    } 

    return mdc; 
} 

मैं हमेशा एक नया DataContract कि केवल DM1 और DM3 है बनाने के लिए और उत्पन्न कि MyDC उदाहरण से लेकिन मैं देखना चाहता हूँ अगर यह संभव है प्रोग्राम के दूर करने के लिए DM2 सकता है। क्या यह संभव है? कैसे?

उत्तर

2
[DataContract] 
class MyDC 
{ 
    [DataMember] 
    public string DM1; 

    public string DM2; 

    public bool IsDM2Serializable; 

    [DataMember(Name="DM2", EmitDefaultValue = false)] 
    public string DM2SerializedConditionally 
    { 
     get 
     { 
      if(IsDM2Serializable) 
       return null; 
      return DM2; 
     } 
     set { DM2=value; } 
    } 

    [DataMember] 
    public string DM3; 
} 

तो गलत पर IsDM2Serializable सेट जब आप इसे छिपाने के लिए की जरूरत है:

[OperationContact] 
public MyDC GetMyDC() 
{ 
    MyDC mdc = new MyDC(); 

    if (condition) 
    { 
     // Code to prevent DM2 from being serialized 
     mdc.IsDM2Serializable = false; 
    } 

    return mdc; 
} 
3

आपका मतलब है धारावाहिकता और deserialization नहीं है।

आप क्रमबद्धता वर्ग के लिए [DataContract] विशेषता लागू करने के लिए एक वर्ग तैयार हैं, केवल वर्ग [DataMember] विशेषता है कि के सदस्यों धारावाहिक की जाएगी:

[DataContract] 
class MyDC 
{ 
    [DataMember] 
    public string DM1; 

    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

कुछ और अधिक जटिल मामलों में [IgnoreDataMember] के उपयोग कर सकते हैं अपनी समस्या हल करें। (http://msdn.microsoft.com/en-us/library/ms733127.aspx देखें)

वैसे, आप पहुंच के खेतों और गुण को क्रमानुसार कर सकते हैं, भले ही: private, protected, internal, protected internal, या public। आप किसी भी पठन/लेखन गुणों को क्रमबद्ध कर सकते हैं न कि केवल फ़ील्ड। संग्रह प्रकारों के क्रमिकरण के बारे में http://msdn.microsoft.com/en-us/library/aa347850.aspx देखें।

[DataContract] 
class MyDC 
{ 
    [DataMember] 
    public string DM1; 

    [DataMember(EmitDefaultValue = false)] 
    public string DM2; 

    [DataMember] 
    public string DM3; 
} 

तो अशक्त करने के लिए इस संपत्ति की स्थापना:

[OperationContact] 
public MyDC GetMyDC() 
{ 
    MyDC mdc = new MyDC(); 

    if (condition) 
    { 
     // Code to prevent DM2 from being deserialized 
     mdc.DM2 = null; 
    } 

    return mdc; 
} 

इस तरह, कि संपत्ति नहीं है

6

एक तरह से यह करने के लिए गलत पर DataMemberAttribute की EmitDefaultValue गुण सेट करने के लिए है serialization पर आउटपुट स्ट्रीम में लिखा है।

http://msdn.microsoft.com/en-us/library/aa347792.aspx

+0

अगर मैं वास्तविक वस्तु मैं क्रमानुसार करने चाहते हैं की एक प्रति बनाने रहा हूँ, और काम करता है कि डॉन ' प्रतिलिपि बदलने के बारे में परवाह नहीं है। हालांकि, मैं उस ऑब्जेक्ट को बदले बिना ऐसा करना चाहता हूं जिसे मैं क्रमबद्ध करने की कोशिश कर रहा हूं। – floatingfrisbee