Domanda

Utilizzo RCF con boost.serialization (perché utilizzare la copia di RCF quando utilizziamo già l'originale?) Funziona bene, ma quando viene generata un'eccezione nel server, non viene passata correttamente al client.Invece, ottengo una RCF::SerializationException che cita an archive_exception dicendo "nome della classe troppo lungo".Quando cambio il protocollo in BsText, l'eccezione è "classe non registrata".Quando cambio il protocollo in SfBinary, funziona.Ho registrato RemoteException sia sul server che sul client in questo modo:

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

Ho anche provato a serializzare e deserializzare a boost::shared_ptr<RCF::RemoteException> nello stesso test e funziona.

Quindi, come posso fare in modo che RCF passi correttamente le eccezioni senza ricorrere a SF?

È stato utile?

Soluzione

Ecco una patch fornita da Jarl su CodiceProgetto:

In RcfServer.cpp, prima della riga in cui è definito RcfServer::handleSession() (intorno alla riga 792), inserire il seguente codice:

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

E in Marshal.cpp, intorno alla riga 37, sostituisci questa riga:

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

, con

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

Altri suggerimenti

Secondo Jarl funziona, controlla codeproject per una domanda e risposta con il codice di esempio:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top