12

次のようなバイトを格納するC++の構造があります。

struct RemoteData 
{
    /// some other fields here

    unsigned char* buf;
    int bufLen;     
};

そして、このデータを C++ で書かれたリモート サービスに、thrift 経由で送信する必要があります。この構造を thrift idl にマップする方法を 3 つ見つけました。

  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 に答える