2

Boost.serialization で RCF を使用しています (オリジナルを既に使用しているのに、なぜ RCF のコピーを使用するのですか?) 問題なく動作しますが、サーバーで例外がスローされると、クライアントに正しく渡されません。archive_exception代わりに、 「クラス名が長すぎます」という発言を引用する RCF::SerializationException を取得します。プロトコルを BsText に変更すると、例外は「未登録クラス」です。プロトコルを SfBinary に変更すると、動作します。次のように、サーバーとクライアントの両方に RemoteException を登録しました。

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

同じテストでa のシリアライズとデシリアライズを試みたところboost::shared_ptr<RCF::RemoteException>、うまくいきました。

では、SF に頼らずに RCF に例外を正しく渡すにはどうすればよいでしょうか?

4

2 に答える 2

2

CodeProjectの Jarl によって提供されたパッチを次に示します。

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);
于 2008-09-25T10:41:52.233 に答える
0

Jarl によると、それは動作するので、codeprojectで質問を確認し、サンプル コードで回答します。

于 2008-09-17T17:29:55.310 に答える