दिलचस्प पोस्ट
जावास्क्रिप्ट के साथ स्थानीय फ़ाइल का उपयोग JSON ऑब्जेक्ट स्ट्रिंग से सी # क्लास फ़ाइल को स्वत: जनरेट कैसे करें एक बहु-फ़ाइल जाने वाली परियोजना को व्यवस्थित करना पार प्रारंभिकता के संकेत क्या हैं? एकाधिक विरासत का उपयोग करते समय मैं डायमंड ऑफ़ डेथ से कैसे बच सकता हूं? क्या मैं एक फाइल डिस्क्रिप्टर को लिनक्स पर किसी अन्य प्रक्रिया में साझा कर सकता हूं या वे प्रक्रिया के लिए स्थानीय हैं? अलार्म को रीसेट करने के लिए, मेरे एंड्रॉइड एप्लिकेशन को कैसे पता चलेगा? MySQL – AUTO_INCREMENT होने के लिए एक कॉलम बदलें कैसे पहलू अनुपात के संरक्षण के लिए स्क्रीन भर में तीन छवियों खिंचाव? क्या iPhone पर छूने का एक तरीका है? पैरामीटर के रूप में अनाम रूपों को कैसे पास करें? दोनों स्थानीय और दूरस्थ जीआईटी भंडार के लिए मास्टर शाखा का नाम बदलें UITextField में बैकस्पेस का पता लगाएं सी # SmtpClient क्लास Gmail का उपयोग कर ईमेल भेजने में सक्षम नहीं है मैं $ http के साथ फार्म डेटा urlencoded कैसे पोस्ट करूं?

सी # टीसीपी के माध्यम से प्राप्त करने के बाद किसी संरचना को डीएसराइलाइज़ करना

मैं TCP इंटरफ़ेस के माध्यम से अपना स्वयं का "पैकेट" ऑब्जेक्ट भेज रहा हूं जो सी # टीसीपीएलस्टनर और टीसीपीक्लाएंट के साथ उपलब्ध कराता है I

यह मेरी संरचना है

[Serializable] struct RemuseNetworkPacket { public String ApplicationCode; public String ReceiverCode; public RemusePacketType Type; public uint ID; public uint cID; public String Name; public byte[] Data; public String Text; public System.Drawing.Point Coords; public String Timestamp; public String Time; public String SenderName; public byte[] Serialize() { var buffer = new byte[Marshal.SizeOf(typeof(RemuseNetworkPacket))]; var gch = GCHandle.Alloc(buffer, GCHandleType.Pinned); var pBuffer = gch.AddrOfPinnedObject(); Marshal.StructureToPtr(this, pBuffer, false); gch.Free(); return buffer; } public void Deserialize(byte[] data) { var gch = GCHandle.Alloc(data, GCHandleType.Pinned); this = (RemuseNetworkPacket)Marshal.PtrToStructure(gch.AddrOfPinnedObject(), typeof(RemuseNetworkPacket)); gch.Free(); } } 

मैं भेजने के पहले और बाद में डेटा तैयार करने और पुनः प्राप्त करने के लिए स्ट्रैलेजेशन के तरीकों का उपयोग कर रहा हूं।

रिसीवर को आने वाले डेटा का आकार पता करने के लिए, मैं बाइट्स को कुछ हेडर डेटा भेजता हूं, एल = 212 के प्रारूप में ; … जिसका अर्थ है लंबाई = 212; और बाकी पैकेट है

प्राप्त करने के अंत में मैं इसके लिए खोज करता हूं जब तक कि मुझे पूरे एल = xxxx नहीं मिलते; तो मैं शीर्ष के बिना एक नई बाइट सरणी बना देता हूं, फिर डेटा को डिसेरीलाइज़ करने का प्रयास करता हूं। Deserialization के लिए उपयोग करने के लिए पैकेट बाइट है: टीसीपी स्ट्रीम का बफर। लांघ – पायाहार्डसिस (एल = xxxx;)

अगर मैं एक ही मशीन पर क्लाइंट और सर्वर को चलाता हूँ, यह बिना त्रुटियों के काम करता है, हालांकि अगर मेरे पास क्लाइंट और सर्वर अलग-अलग मशीनों पर हैं, तो मुझे अपवाद मिलता है और यह क्रैश हो जाता है

अपवाद तब होता है जब पैकेट को deserialized किया जा रहा है, कह रही है:

* System.Runtime.InteropServices.SafeArrayTypeMismatchException बेमेल रनटाइम प्रकार के सरणी के प्रकार और सिस्टम पर मेटाडेटा में दर्ज एसबी प्रकार के बीच हुआ है। Runtime.InteropServices.PtrToStructureHelper

स्टैकट्र्रेस: ​​सिस्टम.रंटईम.इंटरॉप सर्विसेज.प्रट्रूटस्ट्रैक्शन हेल्पर (इंटीपीटीआर पीटीआर, ऑब्जेक्ट स्ट्रक्चर, बूलियन अनुमति दें क्लैसेस) सिस्टम पर.रंटाईम.इंटरॉप सर्विसेज.ट्रेटस्ट्रक्चर (आईटीपीटीआर पीटीआर, टाइप स्ट्रक्चर टाइप टाइप करें .. *

मैं समस्या के कारण की पहचान करने के लिए मदद के लिए पूछ रहा हूं। क्या मैं इसे ऐसे ऑब्जेक्ट के साथ नहीं कर सकता जो नेटवर्क पर आ गया?

वेब के समाधान से एकत्रित समाधान "सी # टीसीपी के माध्यम से प्राप्त करने के बाद किसी संरचना को डीएसराइलाइज़ करना"

स्ट्रिंग होने के बजाय आपकी पैकेट की लंबाई दर्शाती है और फिर स्ट्रिंग की लंबाई से घटाना जानने के लिए कहां पढ़ना शुरू करें, आपको उचित लंबाई-उपसर्ग को लागू करना चाहिए डेटा शीर्षलेख के साथ संयुक्त लंबाई-प्रीफ़िक्सिंग आप अपने आकार के अनुसार प्रत्येक पैकेट को पढ़ने में सक्षम बनाते हैं, तो डेटा हेडर आपको यह निर्धारित करने में सहायता करेगा कि डेटा के साथ क्या करना है।

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

यह निम्न पैकेट संरचना बनाएगा:

 [Length (4 bytes)][Header (1 byte)][Data (x byte(s))] 

पैकेट पढ़ना बहुत आसान है:

  1. पहले 4 बाइट्स पढ़ें ( Length ), उन्हें कनवर्ट करें और एक पूर्णांक चर में असाइन करें।

  2. अगला बाइट पढ़ें (डेटा हेडर) और एक चर में डाल दिया

  3. एक बाइट सरणी के लिए x बाइट पढ़ें (जहां x चरण 1 में घोषित पूर्णांक है)।

  4. अपने डेटा के साथ क्या करना है यह निर्धारित करने के लिए चरण 2 से डेटा हेडर का उपयोग करें (चरण 3 से बाइट सरणी)।

मेरे पिछले उत्तर में से एक में आप ऊपर बताए गए उदाहरणों के उदाहरण देख सकते हैं I

एक संरचना के सीरियल किए गए बाइनरी डेटा प्लेटफार्म और ओएस के आधार पर भिन्न हो सकते हैं। जैसे विभिन्न संरेखण, लंबे समय के विभिन्न आकार के कारण हो सकता है कि आपका कोड एक ही मशीन पर काम करता है, लेकिन किसी भिन्न मशीन पर नहीं।

मैं आपको सुझाव देता हूं कि आप Google ProtoBuf (फास्ट) https://developers.google.com/protocol-buffers/docs/csharptutorial जैसे पुस्तकालय का उपयोग करते हैं

या सी # ऑब्जेक्ट सीरियलाइजेशन पर निर्भर करते हुए जैसे XML सीरियललाइज़ेशन (धीमा) https://msdn.microsoft.com/en-us/library/58a18dwa(v=vs.110).aspx