我使用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>
进行序列化和反序列化,但它确实有效。
那么如何在不诉诸SF的情况下正确地使RCF传递异常?
答案 0 :(得分:2)
这是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);
答案 1 :(得分:0)
根据Jarl的说法,请使用示例代码检查codeproject的问题和答案: