2009-09-23 13 views
7

नाम बदल दिया गया है या नहीं, यदि मेरे पास "असेंबलीए" नामक एक असेंबली में "MyClass" नामक एक वर्ग है और इसे .NET के बाइनरीफॉर्मेटर का उपयोग करके फ़ाइल में क्रमबद्ध करें। फिर "AssemblyB" नाम एक विधानसभा में "MyClass" के कोड के लिए कदम और फ़ाइल मैं निम्नलिखित "System.TypeLoadException" अपवाद प्राप्त deserialize करने की कोशिश:सी # एक वर्ग को deserialize जो

लोड नहीं कर सका प्रकार विधानसभा से 'AssemblyA.MyClass' ' असेंबलीए, संस्करण = 1.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = शून्य '।

क्या मुझे यह इंगित करने का कोई तरीका है कि कक्षा को असेंबली बी में स्थानांतरित कर दिया गया है? किसी प्रकार की विशेषता के माध्यम से? या क्या असेंबली ए। MyClass से Assembly B.MyClass के सभी संदर्भों को बदलने के लिए पूर्व-प्रीप्रोसेसिंग चरण के रूप में धारावाहिक फ़ाइल को संशोधित करना संभव है? आखिरकार, यदि इनमें से कोई भी विकल्प संभव नहीं है, तो क्या इस वर्ग को deserialise करने की कोशिश करना संभव है और शेष डेटा को वैसे भी deserialising जारी रखना संभव है?

उत्तर

6

आप इसे स्थानांतरित कर दिया है, तो dll जहाँ वह अब रहता है के लिए एक संदर्भ जोड़ने के लिए, और प्रयोग TypeForwardedToAttribute:

[assembly:TypeForwardedTo(typeof(TheType))] 

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

का नाम बदलने चालबाज है ... BinaryFormatter के बारे में बेहद भंगुर है ऐसी बातें। आईएमओ, यह केवल दो कसकर युग्मित प्रणालियों के बीच क्षणिक डेटा क्रमबद्ध करने के लिए उपयुक्त है (उदाहरण के लिए, एक ही प्रक्रिया में दो AppDomain एस के बीच विनिमय; जब भंडारण के लिए उपयोग किया जाता है, या सिस्टम के बीच जो सिंक हो सकता है, तो यह एक दुःस्वप्न हो सकता है।

यह बहुत देर हो चुकी हो सकता है, लेकिन मैं एक अनुबंध के आधार पर serializer (बजाय एक प्रकार आधारित serializer) का उपयोग कर की सिफारिश करेंगे, (जब तक आप [DataContract]/[DataMember] विशेषताओं का उपयोग) XmlSerializer के किसी भी, DataContractSerializer, आदि अगर आप तेजी से बाइनरी चाहते हैं, Protobuf शुद्ध एक अच्छा काम एक अन्य अवधारणा है कि क्रमबद्धता किराए की कोख किया जाता है, के लायक हो सकता है क्या करना होगा (और यदि आप की जरूरत है ISerializable में हुक कर सकते हैं)।

, लेकिन था टी अपेक्षाकृत कठिन है। लेकिन आईआईआरसी यह आपको बनाए गए प्रकार पर नियंत्रण देता है - लेकिन इसके लिए आपको लॉट करने की आवश्यकता है।

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