2009-08-26 8 views
7

शीर्षक में प्रश्न ... संक्षेप में - मेरे पास एक डब्ल्यूसीएफ सेवा है जो संचालन का खुलासा करती है जो इकाई वर्गों को वापस लाती है। क्लाइंट-साइड क्लास डिफ़ॉल्ट सिस्टम के बजाय एक सार बेस क्लास से प्राप्त होती है। ऑब्जेक्ट। सार बेस श्रेणी में एक डिफ़ॉल्ट कन्स्ट्रक्टर परिभाषित किया गया है। सेवा विधियों में से किसी एक को कॉल करते समय मैं उम्मीद करता हूं कि निर्माता को कॉल करने के लिए कहा जाता है जब डेटाकंट्रैक सीरियलाइज़र लौटाई गई वस्तुओं को पूरा करता है। हालांकि, निर्माता को बुलाया नहीं जाता है। यदि दूसरी तरफ मैं इकाई वर्ग का एक उदाहरण बना देता हूं तो अमूर्त वर्ग निर्माता को बुलाया जाता है।डब्ल्यूसीएफ deserializer द्वारा एक वस्तु शुरू होने पर मेरा सार आधार वर्ग के कन्स्ट्रक्टर क्यों नहीं कहा जाता है?

क्यों, ओह क्यों, और क्या कोई कामकाज है? या क्या मुझे कुछ याद आया - क्या कोई अन्य कन्स्ट्रक्टर हस्ताक्षर है जिसे ऑब्जेक्ट्स को भौतिक बनाने के दौरान डेटाकंट्रैक सीरियलाइज़र द्वारा बुलाया जाता है? यदि नहीं, तो डेटाकंट्रैक्ट सीरियलाइज़र कन्स्ट्रक्टर को कॉल किए बिना ऑब्जेक्ट्स को कैसे बना सकता है वैसे ही "नया SomeClass()" कॉल करेगा? या मैंने आज बहुत अधिक कॉफी पी ली (केवल 2 या 3 कप अब तक थे)?

उत्तर

11

डब्ल्यूसीएफ (और विशेष रूप से DataContractSerializer) रचनाकारों का उपयोग नहीं करता है। नहीं, वास्तव में (कच्चे ऑब्जेक्ट्स बनाने के लिए यह FormatterServices.GetUninitializedObject का उपयोग करता है)।

यह अपेक्षा की जाती है कि सभी डेटा सीरिएलाइज़र द्वारा या गैर-धारावाहिक क्षेत्रों के लिए शुरू किया जाएगा - आपके द्वारा जोड़े गए क्रमबद्ध कॉलबैक द्वारा (उदाहरण के लिए, [OnDeserialized] के माध्यम से)।

+1

त्वरित उत्तर के लिए धन्यवाद। वाह। वह मुझे आश्चर्यचकित करता है। मैंने सोचा कि सभी ऑब्जेक्ट प्रारंभिक परिणामस्वरूप रचनाकारों को बुलाया जाएगा। ओह ठीक है, मैंने आज कुछ नया सीखा ... :) – KristoferA

+0

यह वास्तव में आश्चर्यजनक है। मुझे पहली बार परावर्तक में खोदना पड़ा जब मैंने इसे देखा! –

+0

एक अनुवर्ती प्रश्न [जिज्ञासा से बाहर] होगा: _why_ क्या उन्होंने ऐसा किया? प्रदर्शन? हमारे सिर के साथ गड़बड़ करने के लिए? या कुछ और बेहतर कारण? :) – KristoferA

1

मैं कारणों को पूरी तरह से समझता हूं, हालांकि मुझे समझ में नहीं आता कि वे सिल्वरलाइट में धारावाहिक कॉलबैक का समर्थन क्यों नहीं करते हैं। ऐसा लगता है कि, डब्ल्यूसीएफ में - सिल्वरलाइट संचार मैं अपने डेटा अनुबंध को हैकिंग के बिना शुरू नहीं कर सकता।

Stack<PropertyChange> UndoStack = new Stack<PropertyChange>(); 

यह केवल काम नहीं करता है: तो, अगर मैं आंतरिक उपयोग के लिए मेरी आधार वर्ग में एक निजी सदस्य था (। उदाहरण के लिए पूर्ववत-फिर से करना व्यवहार), डिफ़ॉल्ट निर्माता का उपयोग नहीं कर सकते हैं। इसे काम करने के लिए मुझे कुछ ऐसा लिखना चाहिए:

Stack<PropertyChange> _UndoStack; 
Stack<PropertyChange> UndoStack 
{ 
    get 
    { 
      return _UndoStack == null ? (_UndoStack = new Stack<PropertyChange>()) : _UndoStack; 
    } 
} 

यह मेरे लिए एक कामकाज लगता है। किसी के पास बेहतर विचार हैं?

+0

यह एक कामकाज की तरह लगता है, लेकिन आपको यह सुनिश्चित करना होगा कि शून्य शून्य जांच और सेटटर के बीच कोई दौड़ स्थिति नहीं है या अन्यथा आप एक थ्रेड के लिए एक स्टेल स्टैक वापस कर सकते हैं। इसे हल करने का एकमात्र तरीका कम से कम OnDeserializing का उपयोग करना है, 'ऑब्जेक्ट सिंक रूट = नई ऑब्जेक्ट()' बनाएं और इसे पूर्ववत स्टैटर गेटटर में लॉक करने के लिए (या सीधे इस विधि में UndoStack उदाहरण बनाएं। – eFloh

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