我将RCF与boost.serialization一起使用(为什么在我们已经使用原始格式的情况下为什么要使用RCF的副本?)它可以正常工作,但是当服务器中引发异常时,它不会正确传递给客户端。取而代之的是,我得到一个RCF::SerializationException引用一个archive_exception,说“类名太长”。当我将协议(protocol)更改为BsText时,异常(exception)是“未注册的类”。当我将协议(protocol)更改为SfBinary时,它可以工作。
我已经在服务器和客户端上都这样注册了RemoteException:

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

我什至尝试在同一测试中对boost::shared_ptr<RCF::RemoteException>进行序列化和反序列化,并且它可以工作。

那么,如何在不依靠SF的情况下使RCF正确传递异常呢?

最佳答案

这是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);

09-06 12:38