2013-03-04 4 views
6

मैं 3 अलग-अलग क्रिप्टोग्राफी कक्षाओं के लिए एक कारखाना पैटर्न लागू कर रहा हूं। कारखाना निर्धारित करेगा कि कौन सा निर्माण करना है और फिर डेटाबेस से सही वर्ग का क्रमबद्ध उदाहरण प्राप्त करें और इसे अनुरोधकर्ता को वापस कर दें। अभी मैं डेटाबेस में उन्हें स्टोर करने के लिए कक्षाओं को क्रमबद्ध करने पर काम कर रहा हूं। मैं एक पीजीपी क्रिप्टोग्राफी कक्षा के लिए एक लिख रहा हूं जिसे BouncyCastle कहा जाता है। मैं फ़ाइलों से कक्षा और चाबियाँ बना सकता हूं लेकिन जब मैं इसे क्रमबद्ध करने का प्रयास करता हूं, तो यह कहता है कि दो सदस्य चर, जो वर्ग PgpPublicKey की कक्षाएं हैं, और PgpPrivateKey, क्रमबद्ध नहीं किए जा सकते हैं क्योंकि उनके पास पैरामीटर रहित कन्स्ट्रक्टर नहीं हैं।सी # पैरामीटर रहित कन्स्ट्रक्टर के बिना एक वर्ग को क्रमबद्ध करें

public void createdBouncyFromFiles() 
{ 
    var bc = new BouncyCastle("C:\\TestFiles\\BouncyPublicKey.txt", "C:\\TestFiles\\BouncyPrivateKey.txt", "Password1"); 
    var xmlSerializer = new XmlSerializer(bc.GetType()); 
    var textWriter = new StringWriter(); 
    xmlSerializer.Serialize(textWriter, bc); 
    var theSerializedClass = textWriter.ToString(); 
} 

कक्षा में दो सदस्य चर हैं जो समस्या हैं।

public class BouncyCastle : ICryptographyProvider 
{ 

    public PgpPublicKey m_publicKey; 
    public PgpPrivateKey m_privateKey; 
    public string m_passPhrase; 
    // cut out the irelevant parts 

यह सार्वजनिक कुंजी वर्ग है। कोई पैरामीटर रहित कन्स्ट्रक्टर नहीं। यह एक खाली नया उदाहरण बनाने deserializing जबकि

public class PgpPublicKey 
{ 
    public PgpPublicKey(PublicKeyAlgorithmTag algorithm, AsymmetricKeyParameter pubKey, DateTime time); 
    // cut other methods 
} 
+1

क्रमबद्ध करने के लिए अपनी खुद की डेटा क्लास बनाएं, आवश्यकतानुसार मूल्यों की प्रतिलिपि बनाएँ –

+1

आप पैरामीटर रहित कन्स्ट्रक्टर क्यों नहीं जोड़ना चाहते हैं? – Restuta

उत्तर

25

किसी भी Serializer क्लास, क्योंकि एक parameterless निर्माता की जरूरत है, तो यह हर सार्वजनिक संपत्ति seialized डेटा से लिया प्रतियां।

यदि आप बिना पैरामीटर के इसे बनाने से बचना चाहते हैं तो आप आसानी से कन्स्ट्रक्टर को निजी बना सकते हैं।

पूर्व:

public class PgpPublicKey 
{ 
    public PgpPublicKey(PublicKeyAlgorithmTag algorithm, AsymmetricKeyParameter pubKey, DateTime time); 

    private PgpPublicKey(); 
    // cut other methods 
} 
+0

मैंने निजी पैरामीटर रहित कन्स्ट्रक्टर की कोशिश की और यह मेरे लिए इस तरह से काम नहीं करता है। मुझे इसके लिए उचित तरीके से deserialize करने के लिए इसे सार्वजनिक करने की जरूरत है –

3

हाँ, XmlSerializer एक parameterless निर्माता क्रमबद्धता काम करने के लिए में मौजूद की आवश्यकता है।

निम्नलिखित जवाब से: Why XML-Serializable class need a parameterless constructor

एक वस्तु की de-क्रमबद्धता, वर्ग के लिए जिम्मेदार के दौरान de-serializing एक वस्तु धारावाहिक वर्ग का एक उदाहरण बनाता है और फिर धारावाहिक खानों को भरने के लिए आगे बढ़ता और गुण केवल एक उदाहरण प्राप्त करने के बाद प्राप्त करने के बाद।

यदि आप चाहते हैं तो आप अपने कन्स्ट्रक्टर को निजी या आंतरिक बना सकते हैं, बस इसके पैरामीटर के रूप में लंबे समय तक।

0

PgpPublicKey और PgpPrivateKey कक्षाएं आपके द्वारा परिभाषित कक्षाएं हैं? बस उन्हें पैरामीटर रहित कन्स्ट्रक्टर जोड़ें।

यदि आप उन्हें बाहर से सुलभ नहीं करना चाहते हैं तो वे निजी हो सकते हैं। Deserializer अभी भी उन्हें उपयोग कर सकते हैं।

1

DataContractSerializer को पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता नहीं है। इसके बदले में कक्षा के विशेष गुण हैं।

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

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