使用boost :: mpl反序列化协议缓冲区

时间:2013-02-12 14:37:52

标签: protocol-buffers boost-mpl

我使用PB创建我的RPC协议,如:

enum EMessages {
  E_MSG_METHOD_CONNECT = 0x8001,
  E_MSG_EVENT_CONNECT  = 0xA001,
 ...
}

struct MsgHeader {
  required int32  sessionRef    = 1;
  required int32  transactionId = 2;
  required int32  status        = 3;
}

struct MSG_METHOD_CONNECT {
  optional Messages    opCode  = 1 [default = E_MSG_METHOD_CONNECT];
  required MsgHeader   header  = 2;
  .. other fields ..
}

现在,我定义了一个接口和一个模板类来添加一个间接级别:

class IMessage {
  virtual INT     getOpCode() = 0;
  virtual STRING  getName() = 0;
  virtual size_t  getSize() = 0;
  virtual INT     SerializeToString(STRING& out) = 0;
  virtual INT     ParseFromString(STRING& in) = 0;
  ....
}

template<class MESSAGE>
class IMessageImpl : public IMessage {
  protected:
    MESSAGE   m_Message;  ///< The Message Implementation
  public:
    virtual MESSAGE&  getMessage() = 0;
};

我会用它作为:

IMessageImpl<MSG_METHOD_CONNECT> MsgConnect;

现在,当我从端点接收数据时,我需要根据消息opCode对其进行反序列化。
阅读this article我正在考虑使用像boost :: mpl :: map这样的类型映射,但由于我从不使用它,我正在寻找一些建议。

&LT;&LT; ------------------------ [编辑] ----------------------- - &gt;&gt;

关于上面的代码,我尝试按以下方式编写代码:

template<class MESSAGE>
class PBMessage : public IMessageImpl<MESSAGE>
{
public:
  PBMessage() {};
  /* ... other methods ... */
};


// Map of types. The key is the Message opCode
typedef typename mpl::map< mpl::pair<mpl::int_[100], PBMessage<MSG_METHOD_CONNECT> >, 
                           mpl::pair<mpl::int_[101], PBMessage<MSG_EVENT_CONNECT> >,
                         > TMessageMap;

// The Message type
template < typename MessageMap, int opCode >
typedef typename mpl::at<MessageMap, mpl::int_<opCode> >::type::value  TMessage;

并且,要从接收到的缓冲区创建消息,我尝试编码(将其作为伪代码):

  class PBMessageFactory : public IMessageFactory {
  public:
    IMessage* createMessage(CHAR* buff, UINT size) {
      int opCode = buff[0]; 
      TMessage<TMessageMap, opCode> msg;
      msg.ParseFromString( STRING(buff) );
    }        
  };

但没有成功......是否有人可以给我一些如何从mpl :: map中检索类型的建议?

谢谢,
丹尼尔。

0 个答案:

没有答案