I think you will get nicer code if you keep template declaration in you header file
// serialization.h
#include <external_library.h>
struct ExternalStruct;
template <typename Archive>
void serialize(Archive& archive, ExternalStruct& external_struct, const unsigned int version);
You then put template implementation into your source file which hiding the details:
// serialization.cpp
#include "serialization.h"
#include <external_library.h>
template <typename Archive>
void serialize(Archive& archive, ExternalStruct& external_struct, const unsigned int version)
{
// ... details here
}
Finally you put "explicit instantiation" for specific archive types you plan to use. This code goes into the same source file as above.
// serialization.cpp continued
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
template void serialize(boost::archive::binary_iarchive& archive,
ExternalStruct& external_struct, const unsigned int version); // explicit instantiation.
template void serialize(boost::archive::binary_oarchive& archive,
ExternalStruct& external_struct, const unsigned int version); // explicit instantiation.