Tôi đang tìm một ví dụ (làm việc) để tuần tự bên ngoài một cấu trúc lớp trong một DLL. Hiện tại tôi không thể tìm thấy bất kỳ ví dụ nào về điều đó. Tài liệu Boost chỉ nói một số macro, các diễn đàn và nhóm tin tức chỉ thảo luận các vấn đề cụ thể với các giải pháp của họ.Đặt serialization của một lớp vào một DLL
Vì vậy, tôi yêu cầu một ví dụ về (bên ngoài) tuần tự hóa cấu trúc lớp như sau. Cùng với mã lớp tôi đã thêm một số mã của tôi để tuần tự hóa (không hoạt động, xem phần dưới cùng của thông báo lỗi).
class Foo
{
public:
Foo() { number_ = 0; }
virtual ~Foo() {}
int getNumber() { return number_; }
void setNumber(int var) { number_ = var; }
private:
int number_;
};
class Bar : public Foo
{
public:
Bar() { doubleNumber_ = 0.0; }
virtual ~Bar() {}
double getDouble() { return doubleNumber_; }
void setDouble(double var) { doubleNumber_ = var; }
private:
double doubleNumber_;
};
Tất cả những gì tôi đã có cho đến nay mã như thế này là:
serializeFoo.h
#ifndef _SERIALIZE_FOO_H_
#define _SERIALIZE_FOO_H_
#include "Foo.h"
#include <boost/serialization/split_free.hpp>
#include <boost/serialization/version.hpp>
namespace boost {
namespace serialization {
template <typename Archive>
void save(Archive& ar, const Foo& object, const unsigned int version)
{
ar << object.getNumber();
}
template <typename Archive>
void load(Archive& ar, Foo& object, const unsigned int version)
{
int number;
ar >> number;
object.setNumber(number);
}
}} //namespace brackets
BOOST_SERIALIZATION_SPLIT_FREE(Foo)
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/export.hpp>
BOOST_CLASS_EXPORT_KEY(Foo)
#endif //_SERIALIZE_FOO_H_
serializeFoo.cpp
#include "serializeFoo.h"
BOOST_CLASS_EXPORT_IMPLEMENT(Foo)
seriali zeBar.h:
#ifndef _SERIALIZE_BAR_H_
#define _SERIALIZE_BAR_H_
#include "Bar.h"
#include <boost/serialization/split_free.hpp>
#include <boost/serialization/version.hpp>
namespace boost {
namespace serialization {
template <typename Archive>
void save(Archive& ar, const Bar& object, const unsigned int version)
{
ar << base_object<Foo>(object);
ar << object.getDouble();
}
template <typename Archive>
void load(Archive& ar, Bar& object, const unsigned int version)
{
double doubleNumber;
ar >> doubleNumber;
object.setDouble(doubleNumber);
}
}} //namespace brackets
BOOST_SERIALIZATION_SPLIT_FREE(Bar)
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/export.hpp>
BOOST_CLASS_EXPORT_KEY(Bar)
#endif //_SERIALIZE_BAR_H_
serializeBar.cpp:
#include "serializeBar.h"
BOOST_CLASS_EXPORT_IMPLEMENT(Bar)
Các serialization mã đi vào một DLL và cần được sử dụng trong một dự án khác sử dụng các lớp Foo và Bar. Mọi thứ đều biên soạn tốt, nhưng trong thời gian chạy, tôi nhận được thông báo
unregistered class - derived class not registered or exported
Vì vậy, tôi đã sử dụng các macro sai? Tôi có bỏ lỡ một macro không? Mã trên có đúng hay có lỗi nào đó về cấu trúc? Có lẽ điều này có thể hữu ích cho rất nhiều người khác nữa, tôi không nghĩ rằng việc đưa serialization của một lớp vào một DLL là rất kỳ lạ ...
Điều tôi thấy trên Boost-tài liệu là 'BOOST_SERIALIZATION_FACTORY_0 (Foo)', nhưng tôi không biết nếu nó là cần thiết và nếu tôi nên sử dụng nó. Link: http://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/special.html#dlls – MOnsDaR
Vâng, nếu nó làm cho bạn cảm thấy tốt hơn, tôi có một dự án mà nó hoạt động tốt và mã trông khá giống với những gì bạn có, ngoại trừ thực tế là tôi bao gồm các tiêu đề lưu trữ ở đầu tệp tiêu đề. P.S. Về mặt kỹ thuật, đó là '.so', không phải là một' .dll', không nên tạo sự khác biệt ... – TC1
Bạn nói đúng, tôi có nghĩa là viết "lib chia sẻ" lúc đầu, nhưng đã viết DLL vì tôi muốn hiển thị rằng nó hiện là một vấn đề với loại lib chia sẻ cụ thể này. – MOnsDaR