2012-03-15 17 views
6

पर कॉल नहीं करता है, मैंने समान प्रश्नों के लोड के माध्यम से पढ़ा है लेकिन उत्तर नहीं मिला है। मैं विजुअल स्टूडियो 2010 का उपयोग कर रहा हूं और 1.47 बढ़ा सकता हूं।व्युत्पन्न ऑब्जेक्ट का बूस्ट क्रमबद्धता व्युत्पन्न के serialize()

यहाँ कोड है, यह पूर्ण और compilable है:

#include "stdafx.h" 

#include <string> 
#include <sstream> 

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

#include <boost/serialization/export.hpp> 

using namespace std; 

class BaseObject 
{ 
public: 

    BaseObject(void) { }; 
    virtual ~BaseObject(void) { }; 

    template<class Archive> 
     void serialize(Archive &ar, const unsigned int version) 
     { /* nothing happens here */ }; 
}; 

class DerivedObject : public BaseObject 
{ 
public: 

    string text; 

public: 

    DerivedObject(void) { }; 
    ~DerivedObject(void) { }; 

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

BOOST_CLASS_EXPORT(DerivedObject) 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    DerivedObject der; 
    der.text = "Testing!"; 

    std::ostringstream os; 
    boost::archive::text_oarchive oa(os); 
    oa.register_type<DerivedObject>(); 

    // I made a DerivedObject, but I'm casting it to a BaseObject 
    // as the serialization code should not have to know what type it is 
    BaseObject *base = &der; 
    // now serialize it 
    oa << *base; 

    printf("serialized: %s\r\n",os.str().c_str()); 

    return (0); 
} 

आप यह असली आसान है देख सकते हैं, और मैं BOOST_CLASS_EXPORT और oa.register_type जादू है कि यकीन है कि DerivdObject :: serialize करना चाहिए था जोड़ दिया है() हालांकि यह वर्चुअल विधि नहीं है .. लेकिन अभी भी बेसऑब्जेक्ट में केवल serialize() कहा जाता है। शायद दृश्य सी ++ के लिए विशिष्ट समस्या? कृपया सलाह दें?

+1

क्या आपके 'बेसऑब्जेक्ट :: धारावाहिक' को 'आभासी' के रूप में चिह्नित नहीं किया जाना चाहिए? – Nick

+0

नहीं यह एक टेम्पलेट है, यह टी –

+0

अच्छा बिंदु - टेम्पलेट बिट नोटिस नहीं किया! – Nick

उत्तर

2

में वर्णित है boost serialization documentation आप आधार वर्ग क्रमबद्धता कोड कॉल करने के लिए अपने व्युत्पन्न वर्ग बताने के लिए की जरूरत है। बस अपनी व्युत्पन्न कक्षा क्रमबद्ध विधि इस तरह लिखें:

template<class Archive> 
    void serialize(Archive &ar, const unsigned int version) 
    { 
     ar & boost::serialization::base_object<BaseObject>(*this); 
     ar & text; 
    }; 
0

मैंने डीबगर या कुछ भी में यह कोशिश नहीं की है, लेकिन ऐसा लगता है कि यह टुकड़ा करने का मामला हो सकता है। शायद तुम इतनी तरह, सूचक द्वारा या संदर्भ के बजाय मूल्य से क्रमानुसार करने के लिए अपने कोड को संशोधित करके यह पता लगाने सकता है ...

BaseObject *base = &der; 
oa << base; // Serialize a pointer 

... या ...

BaseObject& base = der; 
oa << base; // Serialize a reference 
+0

धन्यवाद, लेकिन पहला व्यक्ति अपवाद, अनियंत्रित वर्ग कुछ फेंकता है, और दूसरा मूल रूप से मेरे कोड के समान ही करता है। वही परिणाम ... – CodeOrElse

+0

मुझे बाद में एहसास हुआ कि '<<' ऑपरेटर शायद वैसे भी तर्क द्वारा तर्क लेता है, जो मेरा सिद्धांत पूरी तरह से गलत बनाता है। माफ़ कीजिये। क्या आपने बेस क्लास को पंजीकृत करने का प्रयास किया है? मैं काम पर एक मौजूदा परियोजना पर इस सामान का उपयोग कर रहा हूं, लेकिन सभी विवरण किसी और द्वारा स्थापित किए गए थे, इसलिए मैं सेटअप हिस्से पर पूरी तरह स्पष्ट नहीं हूं। :/ – aldo

+0

मैंने बस बेस क्लास को पंजीकृत करने का प्रयास किया, यह काम नहीं किया, क्षमा करें .. – CodeOrElse

0

यह नहीं है सख्ती से एक जवाब, सिर्फ एक कट्टरपंथी कामकाज।

आधार वर्ग ऐड में:

virtual void StreamToArchive(boost::archive::text_oarchive &oa) = 0; 

तो एक मैक्रो STREAMTOARCHIVE को परिभाषित करने और यह प्रत्येक और हर व्युत्पन्न वर्ग से एक के लिए डाल दिया।

#define STREAMTOARCHIVE void StreamToArchive(boost::archive::text_oarchive &oa) { oa << *this; } 

तो मुख्य में, की जगह

oa << base; 
साथ

base.StreamToArchive(oa); 

हां मुझे पता है, यह बदसूरत है, लेकिन .. अच्छी तरह से यह काम करता है और मैं बस में है कि STREAMTOARCHIVE मैक्रो डाल करने के लिए है व्युत्पन्न कक्षाएं ... मैं इसके साथ रह सकता हूं ...

लेकिन फिर ... इसे किसी ऑब्जेक्ट में वापस पार्स करने के लिए, अब यह एक है nother बात ...

संपादित: करने के लिए बदल 'इस' '* इस'