我正在尝试从字节数组中反序列化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);
}
答案 0 :(得分:1)
你不知道。
相反,您要创建要反序列化的(最外部)对象的实例。
由于Thrift的工作方式,在RPC方案中,信息通常是隐式已知的,因此不进行序列化。 IOW,出于序列化的目的,您必须通过自己的代码知道什么类型。
如果涉及多种类型的“数据记录”,这很容易成为噩梦,所以遵循以下方法已被证明非常方便(且可扩展):
union Outer {
1: MyCoolClass cool;
2: SomeOtherData other;
3: Foobar foobar;
// can be extended with other types as needed
}
使用用于序列化和反序列化的结构,您知道要读取/写入的实例始终是Outer
。