2012-03-15 21 views
6

Tôi đã đọc qua vô số câu hỏi tương tự nhưng chưa tìm thấy câu trả lời. Tôi đang sử dụng Visual Studio 2010 và tăng 1,47.tăng tuần tự hóa đối tượng dẫn xuất không gọi là serialize()

Dưới đây là các mã, đó là đầy đủ và 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); 
} 

Bạn có thể thấy nó thật đơn giản, và tôi đã thêm BOOST_CLASS_EXPORT và oa.register_type kỳ diệu đó là nghĩa vụ để đảm bảo DerivdObject :: serialize() được gọi là mặc dù nó không phải là một phương pháp ảo .. nhưng vẫn chỉ serialize() trong BaseObject được gọi. Một vấn đề cụ thể cho Visual C++ có lẽ? Làm ơn cho lời khuyên?

+1

Không phải 'BaseObject :: serialize' của bạn được đánh dấu là' virtual'? – Nick

+0

Không có mẫu nào, nó có thể t –

+0

Điểm tốt - không nhận thấy mẫu bit! – Nick

Trả lời

2

Như đã trình bày trong boost serialization documentation bạn cần nói với lớp được thừa kế của bạn để gọi mã serialization lớp cơ sở. Chỉ cần viết phương thức tuần tự lớp dẫn xuất như sau:

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

Tôi chưa thử điều này trong trình gỡ lỗi hoặc bất kỳ thứ gì, nhưng có vẻ như nó có thể là trường hợp cắt. Có lẽ bạn có thể tìm hiểu bằng cách sửa đổi mã của bạn để serialize bởi con trỏ hoặc bằng cách tham chiếu thay vì theo giá trị, như vậy ...

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

... hoặc ...

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

Cảm ơn, nhưng cái đầu tiên ném một ngoại lệ, một thứ gì đó chưa đăng ký, và cái còn lại về cơ bản giống như mã của tôi. Cùng một kết quả ... – CodeOrElse

+0

Sau đó tôi nhận ra rằng toán tử '<<' có thể lấy đối số bằng tham chiếu, điều này làm cho lý thuyết của tôi hoàn toàn sai. Lấy làm tiếc. Bạn đã thử đăng ký lớp cơ sở chưa? Tôi đang sử dụng công cụ này trên một dự án hiện tại tại nơi làm việc, nhưng tất cả các chi tiết được thiết lập bởi người khác, vì vậy tôi không hoàn toàn rõ ràng về phần thiết lập. :/ – aldo

+0

Tôi vừa thử đăng ký lớp cơ sở, nó không hoạt động, xin lỗi .. – CodeOrElse

0

Đây không phải là nghiêm túc một câu trả lời, chỉ là một cách giải quyết kludgy.

Trong lớp cơ sở add:

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

sau đó xác định một STREAMTOARCHIVE vĩ mô và đưa nó vào mỗi một trong các lớp dẫn xuất.

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

Sau đó, trong chính, thay thế

oa << base; 

với

base.StreamToArchive(oa); 

Yea tôi biết, đó là xấu xí, nhưng .. cũng nó hoạt động và tôi chỉ phải đặt rằng STREAMTOARCHIVE vĩ mô trong các lớp học có nguồn gốc ... Tôi có thể sống với điều đó ...

Nhưng sau đó ... để phân tích nó trở lại thành một đối tượng, bây giờ đó là một Nother quan trọng ...

chỉnh sửa: thay đổi 'này' thành '* này'

Các vấn đề liên quan