2008-09-15 8 views
2

J'utilise RCF avec boost.serialization (pourquoi utiliser la copie de RCF lorsque nous utilisons déjà l'original?) Cela fonctionne bien, mais lorsqu'une exception est levée dans le serveur, c'est pas transmis correctement au client. Au lieu de cela, je reçois un RCF :: SerializationException en citant un archive_exception disant "nom de la classe trop long". Lorsque je change le protocole en BsText, les exceptions sont "classe non enregistrée". Quand je change le protocole à SfBinary, cela fonctionne. Je me suis inscrit sur RemoteException serveur et client comme ceci:Les exceptions ne sont pas passées correctement via RCF (using Boost.Serialization)

BOOST_CLASS_VERSION(RCF::RemoteException, 0) 
BOOST_CLASS_EXPORT(RCF::RemoteException) 

J'ai même essayé sérialisation et désérialisation un boost::shared_ptr<RCF::RemoteException> dans le même test, et il fonctionne.

Alors, comment puis-je faire RCF passer les exceptions correctement sans avoir recours à SF?

Répondre

2

est ici un patch donné par Jarl à CodeProject:

En RcfServer.cpp, avant la ligne où RcfServer :: handleSession() est définie (autour de la ligne 792), insérer le code suivant:

void serialize(SerializationProtocolOut & out, const RemoteException & e) 
{ 
     serialize(out, std::auto_ptr<RemoteException>(new RemoteException(e))); 
} 

Et Marshal.cpp, autour de la ligne 37, remplacer cette ligne:

ar & boost::serialization::make_nvp("Dummy", apt.get()); 

, avec

T *pt = apt.get(); 
ar & boost::serialization::make_nvp("Dummy", pt); 
0

Selon Jarl cela fonctionne, vérifiez codeproject pour une question et la réponse avec le code exemple:

Questions connexes