2016-03-01 6 views
9

मैंने पाया here के रूप में उपयोग कर रहा हूँ ComponentSerializationService deserializing नहीं ComponentSerializationService।सभी गुण

मेरे उदाहरण में - मेरे पास एक साधारण बटन है और मैंने पृष्ठभूमि रंग बदल दिया है।

को क्रमानुसार इस तरह दिखता है:

public object Serialize(ICollection objects) 
     { 
     var serializationService = _serviceProvider.GetService(typeof(ComponentSerializationService)) as ComponentSerializationService; 

     if (serializationService == null) 
     { 
      throw new Exception("ComponentSerializationService not found"); 
     } 

     SerializationStore returnObject; 

     using (var serializationStore = serializationService.CreateStore()) 
     { 
      foreach (object obj in objects) 
      { 
       if (obj is Control) 
       { 
        serializationService.Serialize(serializationStore, obj); 
       }     
      } 

      returnObject = serializationStore; 
     } 

     return returnObject; 
     } 

और deserialize इस तरह दिखता है:

public ICollection Deserialize(object serializationData) 
     { 
     var serializationStore = serializationData as SerializationStore; 

     if (serializationStore == null) 
     { 
      return new object[] {}; 
     } 

     var componentSerializationService = _serviceProvider.GetService(typeof(ComponentSerializationService)) as ComponentSerializationService; 

     if (componentSerializationService == null) 
     { 
      throw new Exception("ComponentSerializationService not found"); 
     } 

     var collection = componentSerializationService.Deserialize(serializationStore); 

     return collection; 
     } 

मैं दोनों तरीकों में breakpoints निर्धारित किया है और आने वाली वस्तु सही पृष्ठभूमि संपत्ति शामिल है, लेकिन एक बार deserialized संपत्ति जारी नहीं है।

कोई भी विचार आपका स्वागत है। यह कोड नमूने या दस्तावेज़ीकरण की रेखा में बहुत कम एक मुश्किल वर्ग है।

+0

क्या आपने [MSDN] (https://msdn.microsoft.com/en-us/library/hyft4ewk (v = vs.110) .aspx में प्रलेखित ओवरलोड विधि का उपयोग करने का प्रयास किया है) कारण की तरह लगता है क्यों कोई कंटेनर नहीं है क्योंकि पृष्ठभूमि जारी नहीं थी? – t0mm13b

+1

क्या आपने न्यूटॉन्सॉफ्ट.जेसन.जेसन कन्वर्ट की कोशिश की है? यह किसी जटिल प्रकार को क्रमबद्ध/deserializes। मैंने इसे पहले इस्तेमाल किया है और यह बहुत अच्छा है। –

+0

मुझे यकीन है कि आपकी समस्या यह है: एक बार जब आप ऑब्जेक्ट करने के लिए अपना सीरियलाइजेशनस्टोर डाल देते हैं .... आपको अब पता नहीं है कि यह क्या है ... इसलिए अपने Deserialize में आपको इसे SerializationStore पर वापस नहीं डालना चाहिए, आपको सेट करना चाहिए इसे साबित करने के लिए एक सरल परीक्षण करें। इसके अलावा आप यह नहीं दिखा रहे हैं कि serializationService.Serialize (serializationStore, obj); करता है ... व्यक्तिगत रूप से मुझे लगता है कि यह आपकी जटिलता से अधिक है। सामान्य धारावाहिक और deserialize का उपयोग क्यों नहीं .... कार्यान्वयन टाइप करें। कस्टम एक की आवश्यकता क्यों है? संपादित करें मैं घटक SerializationService एक प्रदान की गई एमएस कक्षा – Seabizkit

उत्तर

1

आप इस पर एक नज़र अधिक विशेष रूप से टिप्पणी लेना चाहिए, और देखें कि क्या SerializeAbsolute आप :)

https://msdn.microsoft.com/en-us/library/system.componentmodel.design.serialization.componentserializationservice.serializeabsolute(v=vs.110).aspx

के लिए काम करता है और के रूप में के माध्यम से कार्यान्वित मैं

स्टैंडर्ड क्रमबद्धता बोली, Serialize विधि, केवल उन मानों को क्रमबद्ध करता है जो घटक के डिफ़ॉल्ट स्थिति से भिन्न होते हैं। यह सबसे कॉम्पैक्ट क्रमिकरण तंत्र प्रदान करता है लेकिन मानता है कि एक नव निर्मित वस्तु का उपयोग deserialization के दौरान किया जाएगा। यदि मौजूदा ऑब्जेक्ट का उपयोग किया जाता है, परिणामी deserialized ऑब्जेक्ट क्रमबद्ध ऑब्जेक्ट की मूल स्थिति को डुप्लिकेट करने की गारंटी नहीं है; गुणों के दौरान डिफ़ॉल्ट मान वाले गुण deserialization के दौरान अपने डिफ़ॉल्ट पर वापस रीसेट नहीं किया जाएगा। SerializeAbsolute विधि इस शॉर्टकट का उपयोग नहीं करती है। यह स्रोत ऑब्जेक्ट के सभी गुणों को क्रमबद्ध करता है ताकि डिफ़ॉल्ट स्थिति के बावजूद deserialization सभी ऑब्जेक्ट गुणों को पुनर्स्थापित कर सके।

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