मेरे पास जो परेशानी है वह यह है: सभी वेरिएबल्स (यह इंटिमेट या समग्र वस्तुओं की तरह आदिम नहीं हैं) पहले से ही बाइट्स के अनुक्रम द्वारा दर्शाए गए हैं?
हाँ वे हैं। यहाँ समस्या उन बाइट्स के लेआउट की है। एक साधारण int
2, 4 या 8 बिट लंबा हो सकता है। यह बड़े या छोटे एंडियन में हो सकता है। यह अहस्ताक्षरित हो सकता है, 1 के पूरक के साथ हस्ताक्षरित या यहां तक कि नकारात्मक जैसे कुछ सुपर विदेशी बिट कोडिंग में भी।
यदि आप केवल int
मेमोरी से द्विपद को डंप करते हैं , और इसे "क्रमबद्ध" कहते हैं, तो आपको इसके लिए बहुत अधिक संपूर्ण कंप्यूटर, ऑपरेटिंग सिस्टम और आपके प्रोग्राम को अटैच करना होगा। या कम से कम, उनका एक सटीक विवरण।
तो क्या धारावाहिकीकरण इतना गहरा विषय बनाता है? एक चर को अनुक्रमित करने के लिए, क्या हम इन बाइट्स को स्मृति में नहीं ले जा सकते हैं, और उन्हें एक फाइल पर लिख सकते हैं? मुझे क्या याद आती है?
एक साधारण वस्तु का सीरियलाइजेशन बहुत कुछ नियमों के अनुसार इसे लिख रहा है। वे नियम काफी हैं और हमेशा स्पष्ट नहीं होते हैं। उदाहरण के लिए एक xs:integer
XML में आधार -10 में लिखा है। बेस -16 नहीं, बेस -9 नहीं, लेकिन 10. यह कोई छिपी हुई धारणा नहीं है, यह एक वास्तविक नियम है। और ऐसे नियम क्रमबद्धता को क्रमबद्ध बनाते हैं। क्योंकि, बहुत अधिक, स्मृति में आपके कार्यक्रम के बिट लेआउट के बारे में कोई नियम नहीं हैं ।
वह सिर्फ एक हिमखंड का एक सिरा था। आइए उन सरलतम प्राथमिकताओं के अनुक्रम का एक उदाहरण लेते हैं: एक सी struct
। आप ऐसा सोच सकते हैं
struct {
short width;
short height;
long count;
}
किसी दिए गए कंप्यूटर + ओएस पर एक परिभाषित मेमोरी लेआउट है? खैर, यह नहीं है। वर्तमान #pragma pack
सेटिंग के आधार पर , कंपाइलर फ़ील्ड को पैड करेगा। 32-बिट संकलन की डिफ़ॉल्ट सेटिंग्स पर, दोनों shorts
को 4 बाइट्स में रखा struct
जाएगा, इसलिए वास्तव में मेमोरी में 4 बाइट्स के 3 फ़ील्ड होंगे। तो अब, आपको न केवल यह निर्दिष्ट करना होगा कि short
16 बिट लंबा है, यह एक पूर्णांक है, जो 1 के पूरक में लिखा गया है नकारात्मक, बड़ा या छोटा एंडियन। आपको यह भी लिखना होगा कि आपके प्रोग्राम को सेट करने वाले स्ट्रक्चर की पैकिंग किसके साथ संकलित की गई थी।
यह बहुत अधिक है कि किस बारे में क्रमबद्धता है: नियमों का एक सेट बनाना, और उनसे चिपकना।
उन नियमों को और भी अधिक परिष्कृत संरचनाओं (जैसे कि वैरिएबल लेंथ लिस्ट या नॉनलाइनियर डेटा) को स्वीकार करने के लिए विस्तारित किया जा सकता है, इसमें मानव पठनीयता, वर्जनिंग, बैकवर्ड कम्पैटिबिलिटी और एरर करेक्शन इत्यादि जैसे फीचर्स जोड़े जा सकते हैं, लेकिन एक एकल लिखना भी int
पहले से ही काफी जटिल है यदि आप केवल यह सुनिश्चित करना चाहते हैं कि आप इसे मज़बूती से पढ़ पाएंगे।