独自の Array クラスの代わりに STL ベクトルを使用してみませんか。STL ベクトルのシリアル化は、boost/serialization/vector.hpp に既に組み込まれています。複素数の配列を送信する場合は、次のようにすることができます。
#include <vector>
#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>
#include <boost/serialization/complex.hpp>
#include <boost/serialization/vector.hpp>
using namespace std;
namespace mpi=boost::mpi;
int main (int argc, char *argv[])
{
mpi::environment env(argc, argv);
mpi::communicator world;
int myid=world.rank();
int NN=world.size();
int N=10;
vector< complex<double> >A(N);
if (myid==0)
{
for (int i=0; i!=N; i++)
{
A[i]=complex<double>(i, i);
}
world.send(1, 0, A);
}
if (myid==1)
{
world.recv(0, 0, A);
cout << "###" << endl;
for (int i=0; i!=N; i++)
{
cout << A[i] << "\t" ;
}
cout << endl;
cout << "###" << endl;
}
}
そうでない場合は、ベクターのコンテンツであるデータ型をシリアライズ可能にする必要があります。そのデータ型のシリアライゼーションがブースト シリアライゼーション ライブラリの一部でない場合は、独自のシリアライゼーションを作成する必要があります。たとえば、上記の複雑な構造体の場合、次のように考えるとうまくいくはずです(テストされていません):
namespace boost
{
namespace serialization
{
template<class Archive>
void serialize(Archive & ar, complex & c, const unsigned int version)
{
ar & c.real_imag;
}
}
}
しかし、私が言ったように、STL 複合型は既にブースト シリアライゼーションに組み込まれています。