2010-11-16 14 views
18

मैं एक फ़ाइल में कक्षा उदाहरणों की एक सरणी क्रमबद्ध करने के लिए बाइनरीफॉर्मेटर का उपयोग कर रहा हूं। मैं एक ही आवेदन के भीतर इस जुर्माना को deserialize कर सकते हैं। जब मैं एक अलग आवेदन में एक ही अक्रमांकन (है कि एक आम फ़ाइल है कि काम करता है में खींचती है) तो मैं निम्नलिखित त्रुटि मिलती है कोशिश:बाइनरीफॉर्मेटर को एक अलग एप्लिकेशन में deserialize करने के लिए कैसे प्राप्त करें

{"Could not load file or assembly 'pmlscan, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The module was expected to contain an assembly manifest."} 

जहां pmlscan मूल आवेदन का नाम है। मैं pmlsormatter को कोशिश करने और लोड करने के लिए बाइनरीफॉर्मेटर कैसे प्राप्त करूं?

उत्तर

0

आप नहीं कर सकते!

सर्वश्रेष्ठ विकल्प एक अलग असेंबली में अपने धारावाहिक वर्गों को प्रकाशित करना है और आप इसे सर्वर (सीरिएलाइज़र) और क्लाइंट (deserializer) में संदर्भित करते हैं। इस तरह आप अपने पूरे स्रोत कोड को बाहरी दुनिया में प्रकाशित नहीं कर रहे हैं।

+3

आप यहाँ नेट के बारे में बात कर रहे हैं। सब कुछ संभव है। (हालांकि अलग असेंबली सबसे आसान है)। – GvS

+0

समस्या लोड करने और विफल करने की कोशिश नहीं कर रही है। प्रश्न "पीएमएलस्कैन को आजमाएं और लोड न करें"। – Aliostad

+0

असेंबली रेडियोधर्मी का उपयोग करके आप pmlscan लोड करने का प्रयास नहीं करते हैं। लेकिन कह रहा है "आप नहीं कर सकते!", यह सही नहीं है। चूंकि यह एक जटिल मामला है, इसलिए मैं आपको क्षमा करता हूं और इसके लिए आपको कम नहीं करता ;-) – GvS

3

बाइनरी सीरिएलाइज़र कक्षा और असेंबली जानकारी को बाइनरी सरणी में एन्कोड करता है। जब आप इस सरणी को deserialize करते हैं, deserializer इस जानकारी का उपयोग कक्षा में रहने वाली असेंबली का पता लगाने के लिए करता है, और (यदि आवश्यक हो) असेंबली को आपके ऐप डोमेन में लोड करता है। यदि अन्य एप्लिकेशन में उस विधानसभा तक पहुंच नहीं है जिसमें कक्षा का प्रकार रहता है तो आपको वह त्रुटि दिखाई देगी जो आपको मिल रही है।

जैसा कि एक अन्य पोस्टर द्वारा उल्लिखित है, इन सामान्य वर्गों को साझा असेंबली में डाल दें और उन्हें क्लाइंट/अन्य एप्लिकेशन के साथ-साथ सर्वर एप्लिकेशन पर तैनात करें।

+0

मेरा +1, सर ... – Aliostad

+2

ठीक है, आप हमेशा किसी अन्य असेंबली और deserialization के लिए संगत प्रकार के लिए हल कर सकते हैं। यह काम करता है, लेकिन दिल में कमज़ोर के लिए नहीं। – leppie

2

यदि कक्षाएं समान हैं, और यह एक और असेंबली है, तो आप .config फ़ाइल में assemblyBinding अनुभाग जोड़ने का प्रयास कर सकते हैं।

आपको Resolving Assembly Loads और TypeResolve event के बारे में लेख भी पढ़ना चाहिए।

इन तकनीकों का उपयोग करके आप desetializing के दौरान .Net टाइप सिस्टम को किसी अन्य प्रकार पर रीडायरेक्ट कर सकते हैं।

नोट: साझा साझा कक्षाओं में साझा की गई कक्षाओं को माइग्रेट करना एक और आसान समाधान होगा।

1
sealed class PreMergeToMergedDeserializationBinder : SerializationBinder 
{ 
    public override Type BindToType(string assemblyName, string typeName) 
    { 
     return Type.GetType("BinarySerialization.YourClass"); 
    } 
} 
BinaryFormatter bfDeserialize = new BinaryFormatter(); 
bfDeserialize.Binder = new PreMergeToMergedDeserializationBinder(); 
while (fsRead.Position < fsRead.Length) 
{ 
    YourClass sibla = (YourClass)bfDeserialize.Deserialize(fsRead); 
} 

मान लें कि आप एक exe है कि आपके "YourClass" में डेटा को धारावाहिक और एक अन्य exe कि डी-serializes YourClass वस्तुओं की है।

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

  • कोई संबंधित समस्या नहीं^_^