我有一个像这样的节俭结构:
struct GeneralContainer {
1: required string identifier;
2: required binary data;
}
这个想法是能够在单个"管道"上传递不同类型的节俭对象,并且仍然能够在另一侧正确反序列化。
但是,序列化 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
序列化包含二进制字段的对象时,某种标记会搞砸。这是对的吗?如果是,我可以选择哪些协议?我的目标是最小化生成的序列化字节数组的大小。
谢谢安缦
将其跟踪到节俭 0.4 序列化中的一个错误。在节俭 0.8 中工作正常。