Исключения не были правильно переданы через RCF (с использованием Boost.Serialization) - PullRequest
2 голосов
/ 15 сентября 2008

Я использую RCF с boost.serialization (зачем использовать копию RCF, когда мы уже используем оригинал?) Он работает нормально, но когда на сервере выдается исключение, он не передается правильно клиенту. Вместо этого я получаю RCF :: SerializationException, заключая в кавычку archive_exception, говорящее «имя класса слишком длинное». Когда я меняю протокол на BsText, исключение составляет «незарегистрированный класс». Когда я меняю протокол на SfBinary, он работает. Я зарегистрировал RemoteException на сервере и клиенте так:

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

Я даже пытался сериализовать и десериализовать boost::shared_ptr<RCF::RemoteException> в том же тесте, и он работает.

Так как я могу заставить RCF правильно передавать исключения, не прибегая к SF?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2008

Вот патч, данный Jarl на CodeProject :

В RcfServer.cpp перед строкой, в которой определена RcfServer :: handleSession () (около строки 792), вставьте следующий код:

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

А в Marshal.cpp, около строки 37, замените эту строку:

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

, с

T *pt = apt.get();
ar & boost::serialization::make_nvp("Dummy", pt);
0 голосов
/ 17 сентября 2008

По словам Ярла, это работает, проверьте codeproject на вопрос и ответ с примером кода:

...