2011-08-22 11 views
8

में विधानसभा स्वतंत्र सीरियलाइजेशन मैं सीरियलाइजेशन/डीएसरियलाइजेशन तकनीक का उपयोग करता हूं। बाइनरीफॉर्मेटर कक्षा। हर बार जब नई असेंबली बनाई जाती है तो बाइनरीफॉर्मेटर द्विआधारी डेटा को Deserialize नहीं कर सकता है भले ही कक्षा संरचना समान है, लेकिन असेंबली संस्करण अलग है। क्या कक्षा संरचना अपरिवर्तित रहने पर असेंबली संस्करण की जांच के बिना बाइनरी बफर को deserialize संभव है?एनईटी

+0

क्या आप कक्षा को एक अलग असेंबली में deserialized करने के लिए स्थानांतरित कर सकते हैं? जाहिर है यह बदल नहीं रहा है? – mtijn

+0

हाँ, मैं कर सकता हूँ। मैं असेंबली संस्करण की जांच को छोड़ने और इसे अपने जोखिम पर रखने का एक तरीका ढूंढ रहा हूं। –

+0

मैंने पोस्ट किए गए लिंक को देखें – Carsten

उत्तर

7

इस प्रयास करें:

public sealed class CurrentAssemblyDeserializationBinder : SerializationBinder 
{ 
    public override Type BindToType(string assemblyName, string typeName) 
    { 
     return Type.GetType(String.Format("{0}, {1}", typeName, Assembly.GetExecutingAssembly().FullName)); 
    } 
} 
formatter.Binder = new CurrentAssemblyDeserializationBinder(); 
formatter.Deserialize(inStream); 

थ्रेड पोस्टर जोड़ा गया:

हाँ, यह काम करता है। बस सुनिश्चित करें कि बाइनरी डेटा में किसी भी प्रकार का सिस्टम। जेनेरिक या अन्य लीब्स मौजूद हैं, तो आपको उन्हें बिना किसी बदलाव के पारित करना होगा। "ResizableControls" - पुरानी असेंबली lib 'नाम, "EntityLib" - नया असेंबली नाम। इसके अलावा, संस्करण संख्या को भी मांग पर बदला जाना है।

public sealed class CurrentAssemblyDeserializationBinder : SerializationBinder 
{ 
    public override Type BindToType(string assemblyName, string typeName) 
    { 
     string name; 
     if (assemblyName.Contains("ResizableControl")) 
     { 
      name = Assembly.GetAssembly(typeof(EntityLib.Pattern)).ToString(); 
     } 
     else 
     { 
      name = assemblyName; 
     } 
     return Type.GetType(String.Format("{0}, {1}", 
      typeName.Replace("ResizableControl", "EntityLib"), name)); 
    } 
} 

धन्यवाद, यह वही है जो मुझे चाहिए।

+0

क्या यह deserialization असेंबली स्वतंत्र बनाता है? –

+0

@ किर्क रोब द बाइनरी फॉर्मेटर सीरियलाइज्ड ऑब्जेक्ट के भीतर प्रकार की जानकारी संग्रहीत करता है ताकि यह जान सके कि किस प्रकार इसे deserialize करने के लिए। सीरियलाइजेशन बाइंडर क्लास से विरासत में, बाइनरी फॉर्मेटर से मौजूदा असेंबली में मौजूद प्रकारों के सभी अनुरोधों को रीडायरेक्ट करना संभव है। अगर यह काम करता है तो मुझे बताएं। –

+0

शायद एक और धारावाहिक तकनीक का उपयोग करना बेहतर है, जैसे मार्क ग्रेवेल ने कहा। हालांकि आपने अभी इसके साथ अपना जीवन बचाया है। मैं इसे बाइनरी सॉकेट कनेक्शन में उपयोग कर रहा हूं जो बाइनरीफॉर्मेटर के साथ वास्तव में अच्छा है। धन्यवाद! – Vinzenz

1

मुझे लगता है कि BinaryFormatter के साथ एक पता है कि समस्या यह है - here एक संभव समाधान आप किस प्रकार एक SerializationBinder साथ लोड करने के लिए नियंत्रित कर सकते हैं - और एक उदाहरण कैसे (लगभग सभी .net languagues में) इस का उपयोग करने के लिए लिंक कोड प्रदान करता है

+0

उत्तर के लिए धन्यवाद। यह अच्छा है। एक "लेकिन" है - मेरे मामले में, वर्ग संरचना समान है, असेंबली अलग है, असेंबली का संस्करण भी वही है, लेकिन बाइनरीफॉर्मेटर सभी विवरणों की जांच करता है, जैसे फाइल बनाएं दिनांक। और यह deserialization undoable बनाता है। –

+0

यह सही जवाब है !!!! महान! मेरी मदद की। – Raymond

6

यह BinaryFormatter के साथ निहित है। कुछ उन्नत चीजें हैं जो आप इसके आसपास पाने के लिए कर सकते हैं (सरोगेट्स आदि के साथ), लेकिन यह आसान नहीं है और मैं ईमानदारी से इसकी अनुशंसा नहीं करता हूं।

I दृढ़ता से सुझाव देता है कि आप अनुबंध-आधारित धारावाहिक देखें; उदाहरण के लिए:

  • XmlSerializer
  • DataContractSerializer (लेकिन नहींNetDataContractSerializer)
  • Protobuf शुद्ध

(मैं पिछले के प्रति पक्षपाती हूँ के रूप में यह एक बहुत अधिक कुशल उत्पादन देता है , और जानबूझकर कुछ और संस्करण समस्याओं से बचाता है)

उन सभी मामलों में, डेटा संग्रहण (कम से कम, डिफ़ॉल्ट सेटिंग्स के साथ) किसी भी प्रकारों के ज्ञान को शामिल करता है, नामों के अनुसार अनुबंध के अनुसार, या निर्दिष्ट (आमतौर पर विशेषताओं में) शामिल है।

+1

+1 ptotobuf-net के लिए +1: मेरे लिए एक नया ... – Tigran

+0

@ टिग्रान मैं पूरे दिन उस बारे में बात कर सकता हूं; पी –

+0

मैं केवल एक +1 बना सकता हूं: पी लेकिन गंभीरता से इसका एक कारण होगा मुझे कुछ serialization समय पहले की जरूरत थी ... धन्यवाद! प्रोटोबफ-नेट के लिए – Tigran

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