12

我在 c++ 中有一个结构,它存储这样的字节:

struct RemoteData 
{
    /// some other fields here

    unsigned char* buf;
    int bufLen;     
};

我需要通过 Thrift 将这些数据发送到用 C++ 编写的远程服务。我找到了三种将这种结构映射到 thrift idl 的方法:

  1. 使用这样的容器类型:

    struct RemoteData 
    {
        1: list<BYTE> buf,
        ...
    }
    
  2. 使用binary类型:

    struct RemoteData 
    {
        1: binary buf,
        ...
    }
    
  3. 以类型存储数据string

    struct RemoteData 
    {
        1: string buf,
        ...
    }
    

什么是最好的方法?

4

1 回答 1

15

thriftstring类型中包含的值必须是 UTF8 编码的,否则某些客户端将无法读取它(例如 Java thrift 客户端)。

Thriftlist<byte>类型在 c++ 中会被转换成std::vector<int8_t>,但在其他语言中它会不太好(例如,在 java 中它会被编译成 suboptimal List<Byte>.

就与其他语言客户端的互操作性和协议定义的正确性而言,该binary类型是最佳选择。

由于所有 3 个定义产生的消息大小大致相同,我会选择binary:即使您现在不需要与其他语言的互操作性,将来也可能需要它。

于 2012-12-14T22:23:26.247 回答