2012-04-10 34 views
7

मैं डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग कर ऑब्जेक्ट बनाने को प्रतिबंधित करना चाहता हूं। क्योंकि मेरे पास नीचे की तरह एक desing है:डिफ़ॉल्ट कन्स्ट्रक्टर के बिना डिज़ाइन

class Program 
{ 
    static void Main(string[] args) 
    { 
     BaseClass bc = new BaseClass("",""); 
     XmlSerializer xml = new XmlSerializer(typeof(BaseClass)); 
     StreamWriter sw = new StreamWriter(File.Create("c:\\test.txt")); 
     xml.Serialize(sw,bc); 
     sw.Flush(); 
     sw.Close(); 
    } 
} 
[Serializable] 
public class BaseClass 
{ 
    public string UserName, Password; 
    // I don't want to create default constructor because of Authentication 
    public BaseClass(string _UserName, string _Password) 
    { 
     UserName = _UserName; 
     Password = _Password; 
     f_Authenticate(); 
    } 
    private void f_Authenticate() { } 
} 

public class DerivedClass:BaseClass 
{ 
    public DerivedClass(string _UserName, string _Password) : base(_UserName, _Password) 
    { 
    } 
} 

यह ठीक है। लेकिन serializable जब मैं BaseClass यह इस त्रुटि उत्पन्न करेंगे: Unhandled Exception: System.InvalidOperationException: ConsoleApplication1.BaseC lass cannot be serialized because it does not have a parameterless constructor.

अब मेरी डिजाइन क्योंकि मैं Username, Password मानकों की आवश्यकता है लेकिन डिफ़ॉल्ट निर्माता मेरे डिजाइन को बर्बाद कर रहा है टूट जाता है ....

क्या क्या मुझे करना चाहिए?

+0

दरअसल मैं हर संभावनाओं को सीखना चाहता हूं। अगर मैं इसका उपयोग नहीं कर सकता/सकती हूं तो आप मुझे क्या पेशकश करेंगे? – uzay95

+0

http://stackoverflow.com/questions/267724/why-xml-serializable-class-need-a-parameterless-constructor – Matten

उत्तर

12

एक निजी डिफ़ॉल्ट निर्माता

private DerivedClass() 
{ 
    // code 
} 

serialzer सफलतापूर्वक भले ही यह निजी

+0

का डुप्लिकेट नहीं, क्योंकि इसे एक डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता है, इस प्रकार इसे सार्वजनिक रूप से एक्सेस किया जाएगा। –

+1

@TomWijsman जाहिर है, मैटन के उत्तर – Robbie

+1

पर टिप्पणियां देखें और पूरी तरह से पूर्ण होने के लिए, आप उस निजी कन्स्ट्रक्टर को [अप्रचलित (केवल डिफ़ॉल्ट कन्स्ट्रक्टर केवल क्रमबद्धता के लिए है! ") जोड़ सकते हैं, यह सुनिश्चित करने के लिए कि आप गलती से कॉल नहीं करते यह कक्षा के अंदर से। – yoyo

11

वर्ग अपने उदाहरणों deserializing है इस फोन करेगा बनाएं उदाहरण बनाने के लिए एक parameterless निर्माता की आवश्यकता है, लेकिन आप की जरूरत नहीं है एक सार्वजनिक कन्स्ट्रक्टर को लागू करने के लिए - private या internal कन्स्ट्रक्टर होने के लिए पर्याप्त है जब तक कि इसे कोई पैरामीटर की आवश्यकता न हो।

वैसे, आप DataContractSerializer का भी उपयोग कर सकते हैं, जिसके लिए पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता नहीं है और एक्सएमएल भी बनाता है; यह हमेशा मेरी प्राथमिक पसंद है :-)

+1

यह प्रतिबिंब – Matten

+0

का उपयोग करता है मुझे नहीं पता था कि यह मान्य होगा? मुझे उम्मीद है कि इसे सार्वजनिक कन्स्ट्रक्टर की आवश्यकता होगी। क्या यह निश्चित रूप से काम करता है? यदि हां, तो शांत! – Liam

+0

@TomWijsmanno, नहीं, मेरा मतलब है कि गैर-डिफ़ॉल्ट कन्स्ट्रक्टर (ओपी के उदाहरण में) को कॉल करके, लेकिन मैंने अपना उत्तर/टिप्पणी हटा दी है क्योंकि मुझे एहसास है कि यह धारावाहिक है जो डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करता है और इसलिए यह निजी नहीं हो सकता (मुझे लगता है) – Robbie

1
  • क्या आपने एक निजी पैरामीटर रहित कन्स्ट्रक्टर बनाने की कोशिश की है?

  • तो एक सार्वजनिक एक की जरूरत नहीं है, तो आप हमेशा यह कहते हुए टिप्पणी कर सकते हैं कि यह नहीं किया जाना चाहिए (नहीं सबसे अच्छा समाधान)

आप भी अपनी Serializable कक्षा में गुण पैदा करने की जरूरत है। वेरिएबल्स को नहीं माना जाता है और सीरियलाइजेशन/डीज़ियलाइजेशन प्रक्रिया के दौरान पढ़ा या लिखा नहीं जाएगा