使用Thrift发送二进制数据的最佳方式

时间:2012-12-14 09:50:49

标签: thrift

我在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 个答案:

答案 0 :(得分:12)

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

Thrift list<byte>类型将在c ++中转换为std::vector<int8_t>,但在其他语言中它将不太好(例如,在java中它将被编译为次优List<Byte>

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

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