我正在尝试从字节数组反序列化Thrift对象。

在我发现的所有示例中,解串器都会修改为其提供的org.apache.thrift.TBase接口的实例。
如何创建TBase的实例?

TDeserializer deserializer = new TDeserializer(new TCompactProtocol.Factory());
byte[] data = ...// my serialized thrift object
TBase instance = ... // where to get this one ???

deserializer.deserialize((TBase) instance, data);


deserialize方法的代码:

public void deserialize(TBase base, byte[] bytes) throws TException {
    deserialize(base, bytes, 0, bytes.length);
}

最佳答案

你不知道

而是,创建要反序列化的(最外部)对象的实例。

由于Thrift的工作方式,在RPC方案中,信息通常是隐式已知的,因此不进行序列化。 IOW,出于序列化的目的,您必须通过自己的代码知道什么类型。

如果涉及多种类型的“数据记录”,这很容易成为噩梦,因此遵循以下方法已被证明非常方便(且可扩展):

union Outer {
  1:  MyCoolClass cool;
  2:  SomeOtherData  other;
  3:  Foobar  foobar;
  // can be extended with other types as needed
}


使用该结构进行序列化和反序列化,您知道要读取/写入的实例始终是Outer

10-08 00:47