¿Cómo serializar las clases de plantillas derivadas con Boost.serialize?

Me gustaría serializar / deserializar las siguientes clases:

class Feature{ ... virtual string str()=0; }; template class GenericFeature : public Feature{ T value; ... virtual string str(); }; 

Leí documentación de boost.serialize y dije que debes registrar clases. Puedo registrarlos en el constructor. Pero habrá problemas con la carga, ya que el registro será dynamic, no estático (como entendí, debe registrar las clases antes de la serialización / deserialización).

¿Cómo guardar / cargar este tipo de clases?

Primero dígale a boost que la característica es abstracta, no siempre es necesaria:

 BOOST_SERIALIZATION_ASSUME_ABSTRACT(Feature); 

El método de serialización debería verse más o menos así:

 template void Feature::serialize(Archive & ar, const unsigned int version) { ar & BOOST_SERIALIZATION_NVP(some_member); } template void GenericFeature::serialize(Archive & ar, const unsigned int version) { ar & boost::serialization::base_object(*this); //serialize base class ar & BOOST_SERIALIZATION_NVP(some_other_member); } 

Ahora el punto complicado es registrar clases en serializar / deserializar:

 boost::archive::text_iarchive inputArchive(somesstream); boost::archive::text_oarchive outputArchive(somesstream); //something to serialize Feature* one = new GenericFeature(); Feature* two = new GenericFeature(); Feature* three = new GenericFeature(); //register our class, must be all of posible template specyfication outputArchive.template register_type< GenericFeature >(); outputArchive.template register_type< GenericFeature >(); outputArchive.template register_type< GenericFeature >(); // now simply serialize ;-] outputArchive << one << two << three; // register class in deserialization // must be the same template specification as in serialize // and in the same correct order or i'm get it wrong ;-D inputArchive.template register_type< GenericFeature >(); inputArchive.template register_type< GenericFeature >(); inputArchive.template register_type< GenericFeature >(); Feature* another_one; Feature* another_two; Feature* another_three; // and deserialize ;-] inputArchive >> another_one >> another_two >> another_three; 

Si necesita ocultar el registro explícito en alguna parte y hacerlo más automático, existe la idea de crear una plantilla de functor especial que registre una clase derivada, cree todas las disponibles y coloque en una sola lista, ese método estático de clase Feature las registraría todas. Sin embargo, el problema será que necesita registrarse para todas las versiones del archivo, en este momento no sé si el archivo polimórfico hará el trabajo o no.