通过RCF未正确传递异常(使用Boost.Serialization)

时间:2008-09-15 13:22:55

标签: c++ boost-serialization rcf

我使用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传递异常?

2 个答案:

答案 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的问题和答案: