2011-02-23 13 views
5

मैं एक वर्ग है और मैं एक shared_ptr लेकिन एक वस्तु serializing के सामान्य विधि को क्रमानुसार करने कोशिश कर रहा हूँ काम नहीं कर रहा:बूस्ट C++ serializing *

class Object { 
public: 
    Object(); 
    ~Object(); 

    shared_ptr<char>objectone; 

    friend class boost::serialization::access; 
    template <typename Archive> 
    void serialize(Archive &ar, const unsigned int version) 
    { 
     ar & objectone; 
    } 
}; 

मैं भी इस तरह से यह प्रयास किया है, लेकिन यह अभी भी काम नहीं करता है:

void serialize(Archive &ar, const unsigned int version) 
    { 
     for (int i = 0; i < (strlen(objectone.get())); i++) 
      ar & objectone.get()[i]; 
    } 

कोई विचार यह कैसे दृष्टिकोण है? धन्यवाद।

कुछ अतिरिक्त जानकारी:

मैं पहले से ही दोनों shared_ptr हेडर फाइल को शामिल किया है:

#include <boost/serialization/shared_ptr.hpp> 
#include <boost/serialization/shared_ptr_132.hpp> 

मैं एक स्ट्रिंग में बदल जाएंगे और है कि रास्ते में यह क्रमानुसार करने का प्रयास किया है, लेकिन यह निम्न त्रुटि पैदा करता है : बढ़ावा :: संग्रह :: archive_exception ' क्या(): धारा त्रुटि

friend class boost::serialization::access; 
template <typename Archive> 
void serialize(Archive &ar, const unsigned int version) 
{ 
    if (objectone.get()) { 
     string temp(objectone.get()); 
     ar & temp; 
    } 
    ar & objectone; 
} 
+0

shared_ptr ऐसा नहीं करता जो आपको लगता है कि ऐसा करता है। आप इसे स्ट्रिंग की तरह नहीं मान सकते क्योंकि यह एक स्ट्रिंग नहीं है। यह एक चरित्र के लिए एक स्मार्ट सूचक है। – Alan

उत्तर

2

आप कुछ महत्वपूर्ण अवधारणाओं याद कर रहे हैं। यदि आप एक std :: स्ट्रिंग का उपयोग आप अब एक share_ptr जरूरत नहीं है।

आप

class Object { 
public: 
    Object(); 
    ~Object(); 

    std::string name; 

    template <typename Archive> 
    void serialize(Archive &ar, const unsigned int version) 
    { 
     ar & name; 
    } 
}; 

कर सकते हैं और आप कर रहे हैं।

अलावा

अपनी आवश्यकताओं को देखते हुए यह तुम क्या करने

class test 
{ 
public: 

friend class boost::serialization::access; 

test() 
{  
} 

template<class Archive> 
void save(Archive & ar, const unsigned int version) const 
{ 
    int len = strlen(data.get()); 
    ar & len; 
    for (int index = 0; index < len; ++index) 
     ar & data[index];  
} 
template<class Archive> 
void load(Archive & ar, const unsigned int version) 
{ 
    int len = 0; 
    ar & len; 
    data = boost::shared_array<char>(new char[len+1]); 
    for (int index = 0; index < len; ++index) 
     ar & data[index]; 
    data[len] = 0; 
} 
BOOST_SERIALIZATION_SPLIT_MEMBER() 

boost::shared_array<char> data; 
}; 
+0

कोड स्टब के लिए धन्यवाद। :) जैसा कि मैंने पागल की टिप्पणी में उल्लेख किया है। मेरे पास तारों में मेरे सदस्य चर बदलने की लचीलापन नहीं है, लेकिन मैंने अपनी धारावाहिक विधि में एक स्ट्रिंग रूपांतरण का प्रयास किया जिसने एक त्रुटि उत्पन्न की। यकीन नहीं है कि यह सही दृष्टिकोण था क्योंकि यह बढ़ावा देने के साथ मेरा पहला अनुभव है। सही दिशा में एक बिंदु की सराहना की जाएगी। धन्यवाद। – user459811

4

नहीं है सिर्फ एक से अधिक जनसंपर्क अपने कोड के साथ प्रतीक।

पहले, shared_ptr सरणियों धारण करने के लिए नहीं होती है। यह करना बंद करो।

दूसरा, क्रमबद्धता पुस्तकालय सी शैली तार है कि मैं के बारे में पता नहीं बचा है। यह बहुत लागू करने के लिए कड़ी मेहनत और मूल रूप से व्यर्थ हो जब से तुम vector या string बचा सकता है, है जो आप वैसे भी उपयोग करना चाहिए होगा।

यदि आप वास्तव में char* स्ट्रिंग रखने पर जोर देते हैं तो आपको इसे vector/string में परिवर्तित करने की आवश्यकता है, और इसे सहेजें। फिर पढ़ने आप, कि vector/string वापस पढ़ें आकार पाने के लिए स्मृति को आबंटित की जरूरत की बात है, उस में छड़ी ... आदि ... सूचक ट्रैकिंग इतना काम करने के लिए करता है, तो आपको लगता है कि आप को लागू करना होगा पर भरोसा कर रहे हैं नहीं जा रहा है तुम्हरे द्वारा। मज़े करो।

नए कोड संपादित करें:

आप एक समारोह है कि दोनों को बचाने और लोड को शामिल किया गया में बिट को बचाने कर रहे हैं। यह निश्चित रूप से बहुत अच्छी तरह से wrt लोडिंग काम नहीं करता है। आपको अपने क्रमिकरण को विभाजित करने की आवश्यकता है। if (Archive::is_saving) या तो काम नहीं करेगा। बूस्ट प्रलेखन बताता है कि सीरियलाइजेशन दिनचर्या को सही ढंग से कैसे विभाजित किया जाए।

+1

+1 अपने 'char *' से 'std :: string' में कनवर्ट करें। – karlphillip

+0

मेरे पास तारों में मेरे सदस्य चर बदलने की लचीलापन नहीं है लेकिन मैंने एक स्ट्रिंग रूपांतरण का प्रयास किया जिसने एक त्रुटि उत्पन्न की। क्या कोई मुझे सही दिशा दिखा सकता है? ऊपर कोड शामिल करने के लिए प्रश्न संपादित किया गया है। धन्यवाद। – user459811

4

मन क्या पागल एडी के बारे में shared_ptr इस काम के लिए सही उपकरण नहीं किया जा रहा है कहा रखें है क्या है। चूंकि आपके पास कक्षा परिभाषा को बदलने की लचीलापन नहीं है, इसलिए यहां एक काम है।

बढ़ावा :: क्रमबद्धता एक रैपर make_array प्रदान करता है जो एक सूचक लेता है और इसे क्रमबद्ध करने के लिए एक सरणी के रूप में लपेटता है। धारावाहिक से पहले सरणी आकार ज्ञात होना आवश्यक है।

void serialize(Archive &ar, const unsigned int version) 
{ 
    ar & array_size; // Figure out how to determine this (perhaps strlen(objectone.get()) 

    if (ar::is_loading) 
    { 
     objectone.reset(new char[array_size]); // allocate the array before we load it 
    } 

    if (objectone.get() != NULL) 
    { 
     ar & make_array(objectone.get(), array_size); 
    } 
} 

कि कोड नमूना सुंदर अल्पविकसित है लेकिन अवधारणा बता देते हैं:

फिर आप की तरह कुछ कर सकता है।

+0

मैं इसे 'संग्रह और बढ़ावा :: serialization :: make_array' के साथ कोशिश कर रहा हूं लेकिन "make_array boost :: serialization का सदस्य नहीं है"। #include के अलावा मुझे और क्या शामिल करने की आवश्यकता है? –

+0

@ डेविड डोरिया मुझे विश्वास है कि आपको बढ़ावा देने के लिए शामिल करना होगा :: serialization :: make_array। – tallganglyguy