2010-06-10 21 views
20

को डायरेक्ट बूस्ट सीरियलाइजेशन बूस्ट सीरियलाइजेशन डॉक का कहना है कि वस्तुओं को क्रमबद्ध/deserialize करने का तरीका अंतर्निहित संरचना पर एक धारा के साथ एक बाइनरी/पाठ संग्रह का उपयोग कर रहा है। यह ठीक काम करता है अगर मैं serialized डेटा को std :: स्ट्रिंग के रूप में उपयोग नहीं करना चाहता, लेकिन मेरा इरादा इसे सीधे char * बफर में परिवर्तित करना है। अस्थायी स्ट्रिंग बनाने के बिना मैं इसे कैसे प्राप्त कर सकता हूं?चार सरणी

हल हो गया! जो कि एक उदाहरण चाहते थे के लिए:

char buffer[4096]; 

boost::iostreams::basic_array_sink<char> sr(buffer, buffer_size); 
boost::iostreams::stream< boost::iostreams::basic_array_sink<char> > source(sr); 

boost::archive::binary_oarchive oa(source); 

oa << serializable_object; 
+0

दूसरी तरफ, आप मुफ्त मेमोरी प्रबंधन और जोखिम रिसाव को खत्म क्यों करेंगे और ओवररन :)? –

+0

अफसोस की बात है, प्रदर्शन समस्याओं के कारण :( – scooterman

उत्तर

6

IIUC, आप तय आकार के एक पूर्व आबंटित सरणी में लिखने के लिए चाहते हैं।

आप boost::iostreams::array_sink (stream के साथ लपेटकर इसे एक std :: ostream इंटरफ़ेस देने के लिए) का उपयोग कर सकते हैं।

// serialize obj into an std::string 
std::string serial_str; 
boost::iostreams::back_insert_device<std::string> inserter(serial_str); 
boost::iostreams::stream<boost::iostreams::back_insert_device<std::string> > s(inserter); 
boost::archive::binary_oarchive oa(s); 

oa << obj; 

// don't forget to flush the stream to finish writing into the buffer 
s.flush(); 

// now you get to const char* with serial_str.data() or serial_str.c_str() 

deserialize करने के लिए,

// wrap buffer inside a stream and deserialize serial_str into obj 
boost::iostreams::basic_array_source<char> device(serial_str.data(), serial_str.size()); 
boost::iostreams::stream<boost::iostreams::basic_array_source<char> > s(device); 
boost::archive::binary_iarchive ia(s); 
ia >> obj; 

इस का उपयोग करें:

+0

@op: धन्यवाद, यह एक आकर्षण की तरह काम करता था! मैं चाहता था कि बूस्ट में अधिक दस्तावेज़ीकरण हो :( – scooterman

31

आप डेटा आप पहले से भेज रहे हैं के आकार का पता नहीं है, तो इस में क्रमानुसार करने एक std::string एक सामान्य तरीका है एक आकर्षण की तरह काम करता है, मैं इसका उपयोग MPI के साथ डेटा भेजने के लिए करता हूं।

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

+0

महान उत्तर! मैं बफर को स्मृति में रखने के लिए प्रयास कर रहा हूं जैसा कि आप सुझाव देते हैं, लेकिन ऐसा लगता है कि serial_str.clear() को कॉल करना पर्याप्त नहीं है - क्या मुझे किसी भी तरह binary_orachive या back_inserter_device पर रीसेट करने की आवश्यकता है, इसे serial_str की शुरुआत में लिखने के लिए कहने के लिए कहें? –

+0

@omer, मेरे कोड में बस मेरे पास है 'std :: स्ट्रिंग serial_str' एक सदस्य चर के रूप में, और जब भी मैं कुछ भेजता हूं, हर चीज को फिर से बनाते हैं। – martinus

+0

यह समाधान मैं 'के लिए देख रहा था। धन्यवाद! – aardvarkk

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