1

私は次のような倹約構造体を持っています:

struct GeneralContainer {
    1: required string identifier;
    2: required binary data;
}

アイデアは、単一の「パイプ」でさまざまなタイプのthriftオブジェクトを渡すことができ、それでも反対側で正しく逆シリアル化できるようにすることです。

ただし、GeneralContainerオブジェクトをシリアル化してから逆シリアル化すると、dataフィールドの内容が変更されます。私は使用していTBinaryProtocolます:

TSerializer serializer = new TSerializer(new TBinaryProtocol.Factory());
TDeserializer deserializer = new TDeserializer(new TBinaryProtocol.Factory());

GeneralContainer container = new GeneralContainer();
container.setIdentifier("my-thrift-type");
container.setData(ByteBuffer.wrap(serializer.serialize(myThriftTypeObject)));

byte[] serializedContainer = serializer.serialize(container);
GeneralContainer testContainer = new GeneralContainer();
deserializer.deserialize(testContainer, serializedContainer);
Assert.assertEquals(container, testContainer);  // fails

を使用してバイナリフィールドを含むオブジェクトをシリアル化すると、ある種のマーカーが台無しになっていると思いますTBinaryProtocol。あれは正しいですか?はいの場合、プロトコルのオプションは何ですか? 私の目標は、結果のシリアル化されたバイト配列のサイズを最小限に抑えることです。

ありがとう、アマン

4

1 に答える 1

0

Thrift 0.4 シリアライゼーションのバグを追跡しました。Thrift 0.8 で問題なく動作します。

于 2012-11-27T13:02:57.433 に答える