2010-11-14 9 views
6

में कनवर्ट करें, इसलिए मेरे पास एक सर्वर और क्लाइंट है जो विभिन्न डेटा को वापस और चौथाई संवाद करता है। शुरुआत में मेरे पास एक जटिल विधि थी जो बाइट सरणी के माध्यम से चली गई और इसके सभी चर और तारों को एक-एक करके परिवर्तित कर दिया, जिसे वे होना चाहते थे। मुझे लगता है मैं एक वस्तु में चर रख सकते हैं और यह एक बाइट सरणी में बदलने काकिसी ऑब्जेक्ट को सी # में बाइट सरणी में कनवर्ट करें, इसे सॉकेट पर भेजें, फिर ऑब्जेक्ट

private static byte[] ObjectToByteArray2(Object obj) 
    { 
     if (obj == null) 
      return null; 
     BinaryFormatter bf = new BinaryFormatter(); 
     MemoryStream ms = new MemoryStream(); 
     bf.Serialize(ms, obj); 
     return ms.ToArray(); 
    } 

का उपयोग कर और

private static Object ByteArrayToObject(byte[] arrBytes) 
    { 
     MemoryStream memStream = new MemoryStream(); 
     BinaryFormatter binForm = new BinaryFormatter(); 
     memStream.Write(arrBytes, 0, arrBytes.Length); 
     memStream.Seek(0, SeekOrigin.Begin); 
     Object obj = (Object)binForm.Deserialize(memStream); 
     return obj; 
    } 

समस्या यह है, एक बार मैं इस बाइट सरणी पार भेजने का उपयोग करते हुए इसे वापस परिवर्तित कर सकते हैं सीखा किसी अन्य एप्लिकेशन के लिए नेटवर्क, मैं इसे वापस बदलने के लिए इस विधि का उपयोग नहीं कर सकता, मुझे त्रुटि मिलती है "असेंबली ढूंढने में असमर्थ 'test1s, संस्करण = 1.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = null'। test1s केवल छोटे सर्वर प्रोग्राम का नाम है जिसे मैंने इसके साथ खेलने के लिए बनाया है। जाहिर है कि एप्लिकेशन को इस सरणी को किसी ऑब्जेक्ट में बदलने के लिए कुछ अतिरिक्त जानकारी चाहिए, तो क्या मैं ऐसा कर सकता हूं, या क्या मैं समस्या के बारे में गलत हूं?

जो मैं यहां पूरा करना चाहता हूं उसके पास कुछ भी नहीं है लेकिन कई चर और तार हैं, इसे बाइट सरणी में परिवर्तित करें, इसे किसी अन्य एप्लिकेशन पर भेजें, और उसे ऑब्जेक्ट में वापस परिवर्तित करें। इस तरह मुझे अपने सभी चर और तारों को निकालने के लिए बाइट सरणी के साथ खेलना नहीं है।

धन्यवाद

+0

यदि मैं आप थे, तो मैं इसे समझने के लिए एक डीबगर का उपयोग करूंगा। जब तक, आप मानते हैं कि एक डीबगर सभी बुराई की मां है। यदि आप नहीं जानते कि मेरा क्या मतलब है इसका भार प्राप्त करें: http://stackoverflow.com/questions/602138/is-a-debugger-the-other-of-all-evil – YWE

उत्तर

8

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

XmlSerializer, DataContractSerializer और JavaScriptSerializer अच्छा पाठ आधारित कार्यान्वयन हैं, और दोनों सिरों पर एक संगत अनुबंध (समान गुण आदि - जरूरी नहीं कि एक ही प्रकार/संस्करण) के साथ ठीक से काम करेगा।

यदि आपके पास मध्यम बैंडविड्थ की ज़रूरत है, या बेहतर CPU प्रदर्शन की आवश्यकता है तो मैं प्रोटोबफ-नेट (चेतावनी: मैंने इसे लिखा) की सिफारिश करेंगे जो एक तेज़ बाइनरी सीरिएलाइज़र है जो मदद कर सकता है।

4

यह कार्य करेगा जब संचार चैनल के दोनों ओर बिल्कुल बिल्कुल एक ही विधानसभा और के लिए एक संदर्भ है कि विधानसभा का एक ही संस्करण है, या तो किसी भी तरह या में रहने वाले कार्यक्रम से संदर्भित GAC।

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

यदि एक कॉम्पैक्ट प्रारूप आवश्यक है, तो आप Google Protocol Buffers पर विचार कर सकते हैं।

1

यदि स्ट्रिंग्स (या तारों का एक नियम) की एक सूची भेजना है तो आप चाहते हैं कि कोई समस्या न हो, केवल तारों की एक सूची (या dict) भेजें। आपकी समस्या आती है क्योंकि आप एक डेटाटाइप भेजने की कोशिश कर रहे हैं कि अन्य परियोजना पहचान नहीं पाती है। आपको अपने किसी भी फ़ंक्शन को बदलने की भी आवश्यकता नहीं है, आपको बस जो भी भेजना है उसे बदलने की जरूरत है। वैकल्पिक रूप से आप डेटा प्राप्त करने वाले प्रोग्राम से test1s का संदर्भ दे सकते हैं।

0

बाइनरीस्ट्रीम का उपयोग करने के बजाए अपनी ऑब्जेक्ट को बाइट्स कनवर्टर से लिखें।

यदि आप जोर देते हैं, तो इस वस्तु को अपनी असेंबली में ले जाएं, और संदर्भ के रूप में दोनों पक्षों में जोड़ें। इस तरह, .NET Framework ऑब्जेक्ट को डी/क्रमबद्ध करने में सक्षम होना चाहिए।

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