2010-01-24 11 views
8

क्या सी ++ के लिए जावा/.NET क्रमबद्धता के समान कुछ है?क्या सी ++ ऑब्जेक्ट को स्वचालित रूप से क्रमबद्ध करना संभव है?

+2

नहीं क्योंकि सी ++ में रनटाइम प्रतिबिंब नहीं है। एक अच्छे विकल्प के लिए sths जवाब देखें। –

+2

http://stackoverflow.com/questions/1810372/c-serialization-library-that-supports-partial-serialization और http://stackoverflow.com/questions/1809670/how-to-implement-serialization-in का डुप्लिकेट -सी और http://stackoverflow.com/questions/234724/how-to-serialize-in-c और कई अन्य चुनौतीपूर्ण और जटिल खोज के साथ पाए गए http://stackoverflow.com/search?q=c%2B% 2 बी + क्रमबद्धता + लाइब्रेरी – dmckee

उत्तर

12

बूस्ट में serialization library शामिल है। मैंने इसे स्वयं नहीं इस्तेमाल किया है, लेकिन आम तौर पर बूस्ट लाइब्रेरी काफी अच्छी तरह से काम करते हैं।

+6

जब आप शरीर में प्रश्न का उत्तर देते हैं, तो आपने शीर्षक में प्रश्न का समाधान नहीं किया - जो कि अधिक दिलचस्प है –

+0

शीर्षक में प्रश्न का उत्तर है: नहीं, सी ++ स्वचालित रूप से नहीं होता है अपनी वस्तुओं को क्रमबद्ध करें। – sth

6

दुर्भाग्य से सी ++ में ऑब्जेक्ट्स को क्रमबद्ध करने का कोई स्वचालित तरीका नहीं है। ऐसा इसलिए है क्योंकि किसी भी धारावाहिक इंजन को आपके कस्टम किए गए ऑब्जेक्ट को रन-टाइम में "समझने" में सक्षम होना चाहिए और सी ++ में इसके लिए आवश्यक जानकारी नहीं है। जावा और दूसरी तरफ नेट, क्या कहा जाता है, प्रतिबिंब। यह तंत्र रन-टाइम में किसी भी मनमाने ढंग से ऑब्जेक्ट की डेटा संरचना ब्राउज़ करने की अनुमति देता है।

यह सब इसका मतलब यह नहीं है कि अपेक्षाकृत कम प्रयास के साथ सी ++ ऑब्जेक्ट को क्रमबद्ध करने का कोई तरीका नहीं है। उदाहरण के लिए मानक सी ++ स्ट्रीम लाइब्रेरी लें।

int x = 2010; 
cout << x << endl; 

लिखकर आप वास्तव में प्रकार int की वस्तु को क्रमबद्ध करते हैं। अपनी कस्टम कक्षा का समर्थन करने के लिए भी इस तंत्र का विस्तार करना संभव है। यह ऑपरेटर < < ओवरलोडिंग द्वारा किया जाता है। यह जावा धारावाहिक के रूप में उतना अच्छा नहीं है, लेकिन यह भी बहुत सुविधाजनक है।

कुछ पुस्तकालय भी हैं जो इसे और भी सरल बनाते हैं। जैसा कि पहले से ही उल्लेख किया गया है, boost serialization library एक अच्छा काम करता है। बूस्ट क्रमबद्धता के साथ काम करना iostream के साथ काम करने के समान ही दिखता है लेकिन यह मानक धाराओं के लिए निहित कुछ समस्याएं हल करता है।

3

Google का protocol buffers कोर पैकेज में सी ++ कार्यान्वयन प्रदान करता है; एक अच्छा लाभ के रूप में, आप इस डेटा को lots of other languages के साथ साझा कर सकते हैं - लेकिन आप प्रकारों को अपने आप के बजाय उत्पन्न कर सकते हैं (जो अन्य भाषाओं में कुछ धारावाहिक इंजन समर्थन करते हैं)।

असल में यह कोई समस्या नहीं है, (यदि आवश्यक हो) तो आप केवल जेनरेट किए गए प्रकारों को एक डीटीओ के रूप में देख सकते हैं जो आपके वास्तविक डोमेन ऑब्जेक्ट्स में जुड़ जाता है।

3

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

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

यह ध्यान दिया जाना चाहिए कि पूरे structs को सहेजने की लोकप्रिय विधि (उन्हें चार * और लेखन आकार (संरचना) बाइट्स को कास्टिंग करके) पूरी तरह से अप्राप्य है, यह संस्करण का समर्थन नहीं करता है और यदि संरचना में कोई भी होता है तो यह टूट जाता है पॉइंटर्स या सी ++ (गैर-पीओडी) ऑब्जेक्ट्स।

1
(वास्तव में, अपने खुद के दखल या गैर दखल RTTI को लागू करने) के मैनुअल घुरघुराना बहुत काम एक स्वचालन सी #/जावा के साथ तुलनीय के स्तर को प्राप्त कर सकते हैं

How to implement serialization in C++

1

मैं सफलतापूर्वक इस एक का इस्तेमाल किया है::

यहाँ विस्तृत जानकारी देखें

http://uscilab.github.io/cereal/

और यह दोनों iOS और Android पर मेरे लिए अच्छी तरह से काम किया। यह केवल एक शीर्षलेख है और इसकी कोई बाहरी निर्भरता नहीं है इसलिए इसका उपयोग करना बेहद सुविधाजनक है। मैंने इसे बढ़ावा देने के लिए पसंद किया क्योंकि मैं सभी बूस्ट निर्भरताओं को आयात नहीं करना चाहता था। पुस्तकालय छोटा है और एक्सएमएल, जेएसओएन, बाइनरी और कस्टम सीरियलाइजेशन प्रारूप दोनों का समर्थन करता है।

लाइब्रेरी (जैसे बूस्ट) के लिए आपको बेस क्लास के लिए कुछ सीरियलियाज़ियन और डी-सीरियलाइजेशन कोड स्पष्ट रूप से लिखने की आवश्यकता होती है, जबकि संग्रह स्वचालित रूप से संभाले जाते हैं।