Les exceptions ne sont pas correctement transmises via RCF (à l'aide de Boost.Serialization)

StackOverflow https://stackoverflow.com/questions/62810

  •  09-06-2019
  •  | 
  •  

Question

J'utilise RCF avec boost.serialization (pourquoi utiliser la copie de RCF alors que nous utilisons déjà l'original?) Cela fonctionne correctement, mais lorsqu'une exception est générée sur le serveur, elle n'est pas transmise correctement au client. Au lieu de cela, je reçois une exception RCF :: SerializationException citant un archive_exception disant & "Nom de classe trop long &"; Lorsque je modifie le protocole en BsText, les exceptions sont & "Classe non enregistrée &"; Lorsque je change le protocole en SfBinary, cela fonctionne. J'ai enregistré RemoteException sur le serveur et le client, comme suit:

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

J'ai même essayé de sérialiser et de désérialiser un boost::shared_ptr<RCF::RemoteException> dans le même test, et ça marche.

Comment faire en sorte que RCF transmette correctement les exceptions sans recourir à SF?

Était-ce utile?

La solution

Voici un correctif proposé par Jarl à l'adresse CodeProject :

Dans RcfServer.cpp, avant la ligne où RcfServer :: handleSession () est défini (autour de la ligne 792), insérez le code suivant:

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

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

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

, avec

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

Autres conseils

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top