2011-06-02 18 views
8

मैं बूस्ट सीरियलाइजेशन लाइब्रेरी का उपयोग करके एक स्ट्रिंग में एक वर्ग को क्रमबद्ध करने की कोशिश कर रहा हूं और मेरी कक्षा में शामिल कई डबल सदस्य चर हैं।बूस्ट सीरियलाइजेशन और युगल

friend class boost::serialization::access; 

template<class Archive> 
void serialize(Archive & ar, const unsigned int version) 
{ 
    if (version > 0) 
    { 
     ar & mLatitude; 
     ar & mLongitude; 
    } 
} 

जब मैं एक स्ट्रिंग के लिए क्रमानुसार, बढ़ावा नहीं करता है:

#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/serialization/string.hpp> 

std::stringstream ss; 
boost::archive::text_oarchive oa(ss); 
oa << mPoint; 

यहाँ मेरी प्वाइंट वर्ग के भीतर serialiation विधि है:

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

अजीब क्या है और मुझे समझ में नहीं आता है, हालांकि ऐसा लगता है कि जब मैं स्ट्रिंगस्ट्रीम का उपयोग कर रहा हूं और डबल को स्ट्रीम पर रीडायरेक्ट कर रहा हूं और न ही जब मैं स्ट्रिंगस्ट्रीम से कन्वर्ट करने के लिए बूस्ट के लेक्सिकल_कास्ट फ़ंक्शन का उपयोग करता हूं। str() एक डबल पर वापस। बूस्ट की खोज करने से पहले अपने स्वयं के क्रमिकरण/deserialization वर्ग था, मैंने वास्तव में स्ट्रिंगस्ट्रीम और lexical_cast कॉल का उपयोग कर अपना खुद लिखा था और यह w/o मुद्दा काम किया। मैं वास्तव में उम्मीद कर रहा हूं कि मुझे क्रमबद्धता लाइब्रेरी को त्यागना नहीं है और मेरे पास पहले जो कुछ था, उस पर वापस जाना है। उम्मीद है कि बस कुछ सेटिंग/विशेषता/आदि है। मुझे याद आ रही है।

+0

स्पष्ट और मूर्ख सुझाव नहीं स्ट्रिंग के रूप में, एक बाइनरी डेटा के रूप में यह क्रमानुसार करने हो सकता है? शायद यह समाधान है? दोबारा अगर यह इतना आसान था कि आप शायद पहले से ही ऐसा करेंगे ... :) अगर मैं उत्तर के बिना लंबे समय तक नहीं था और समाधान खोजने के लिए मेरी जिज्ञासा नहीं करता तो मैं अपनी सलाह नहीं दे रहा। :) – NoSenseEtAl

+0

बूस्ट के लेक्सिकल_कास्ट में उचित तर्क को सटीक रूप से सेट करने के लिए जटिल तर्क है - देखें http://www.boost.org/doc/libs/1_46_1/boost/detail/lcast_precision.hpp –

+0

क्या आप मानों का उदाहरण दे सकते हैं क्या करें और सही ढंग से गोल-यात्रा न करें? –

उत्तर

2

आप इसे करने के लिए serialising से पहले चल बिन्दु के लिए वैज्ञानिक स्वरूप का उपयोग करना अपनी स्ट्रीम के लिए मजबूर की कोशिश कर सकते:

ss << std::scientific; 

ऐसा लगता है कि बढ़ावा पुस्तकालय सही ढंग से सटीक सेट की तरह है, लेकिन प्रकट नहीं होता है प्रारूप सेट करने के लिए। वैकल्पिक रूप से, क्या आप सोच सकते हैं कि शेष लाइब्रेरी को फेंकने के बिना फ्लोटिंग पॉइंट नंबरों को सहेजने और/या लोड करने के लिए तर्क को ओवरराइड करें - here प्रारंभ करें।

यह भी दिखता है जैसे वहाँ work in progress infinities आदि के समर्थन पर

+0

मैंने अपने डेटा तत्वों को फ्लोट के रूप में प्रतिनिधित्व करने के लिए कक्षा को भी संशोधित किया था, जो डबल करने के विपरीत था और ऐसा करने के लिए कम से कम मेरे मुद्दे को हल किया गया था। –

0

यह सीधे Boost.Serialization प्रश्न का उत्तर नहीं देता है, लेकिन यह एक संभावित कार्यवाही है।

उपर्युक्त प्रश्न से, यह मुझे स्पष्ट नहीं है कि आपको एक स्ट्रिंग प्रतिनिधित्व की आवश्यकता है या नहीं। यदि आप क्रॉस-प्लेटफ़ॉर्म प्रतिनिधित्व (बाइनरी या अन्यथा) की तलाश में हैं, तो protobuf का उपयोग करने पर विचार करें, जिसमें double एस एन्कोडिंग के लिए समर्थन है।

http://code.google.com/apis/protocolbuffers/docs/proto.html#scalar

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