दिलचस्प पोस्ट
इकाई फ़्रेमवर्क में डालने का सबसे तेज़ तरीका Php का उपयोग करते हुए json पोस्ट भेजें मेरे ViewPager को एक समय में केवल एक पृष्ठ लोड कैसे कर सकता है अर्थात setOffscreenPageLimit (0); यह कैसे पता लगा है कि लेनदेन पहले ही शुरू हो चुका है? java.lang.IllegalStateException: प्रतिक्रिया के बाद (आगे | प्रेषण भेजें | सत्र बनाएँ | JSON विशेषता को निकालें टॉगल स्विच के रूप में UIButton का उपयोग कैसे करें जब .NullRefException नल है क्यों .NET foreach लूप फेंकता है? सी # मैं एक फाइल का परीक्षण कैसे कर सकता हूं jpeg? ए स्टार में बैक लाइकिंग सी # में "उपयोग" का उपयोग PHP यूआरएल एन्कोडिंग / डिकोडिंग एक HTML चेकबॉक्स की जाँच की गई विशेषता के लिए उचित मूल्य क्या है? JSF पृष्ठ पर वर्तमान तिथि प्रदर्शित करें मैक ओएस 10.11 पर आर एक्सएलएसएस पैकेज लोड नहीं किया जा सकता

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

मैं 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

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

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

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

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

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