$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-users] Serializing derived class in dll
From: Christian Bergstrand (christian_at_[hidden])
Date: 2009-06-12 15:54:58
I am working on a programwith pluggable classes delivered in DLLs, so I 
have an virtual abstract base class in my EXE and both abstract and 
concrete classes in a hiearchy in my first DLL. I am trying ot serialize 
the derived class instances through a base class pointer. I am not able 
to get it to work after reading the samples in the documentation and the 
most likely looking threads here.
So I broke it down in to a sample EXE/DLL and can still not get it to work.
I am using version 1_38 currently, also tried with 1_36_0
I am getting the exeption on oserializer.hpp:374 where the comment says
            // note:if this exception is thrown, be sure that derived 
pointer
            // is either registered or exported.
In my opinion I am exporting my derived class, but I am feeling that it 
is probably going into the wrong instance, since the export code is 
going into the DLL, but I can not find any other recomendation.
So what am I missing ...
------------------------
serializedll\base.h
------------------------
#pragma once
class Base
{
public:
    virtual void f() = 0;
private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
    }
};
BOOST_SERIALIZATION_ASSUME_ABSTRACT( Base )
------------------------
serializedll\serializedll.cpp, in the EXE
------------------------
#include <tchar.h>
#include <windows.h>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/nvp.hpp>
#include "base.h"
int _tmain(int argc, _TCHAR* argv[])
{
    typedef Base * ( GetObjFun )();
    GetObjFun * f = (GetObjFun*)GetProcAddress( LoadLibrary( TEXT( 
"plugin.dll" ) ), "getobj" );
    Base * obj = f();
    std::ofstream ofs( "c:\\test.xml" );
    boost::archive::text_oarchive oa(ofs);
    oa << obj;
    return 0;
}
------------------------
plugin\plugin.cpp, in the DLL
------------------------
#include <windows.h>
#include <boost/serialization/export.hpp>
#include <boost/archive/text_oarchive.hpp>
#include "../serializedll/base.h"
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID 
lpReserved )
{
    return TRUE;
}
class Derived : public Base
{
public:
    virtual void f()
    {
    }
private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & boost::serialization::base_object< Base >( *this );
    }
};
BOOST_CLASS_EXPORT( Derived )
Base * getobj()
{
    return new Derived();
}