我的 Thrift 对象有一个字符串表示形式,如下所示:
objStr = "MyObject(id:1, name:abc xyz, flag:true)"
我想将其转换回 Thrift 对象本身。我怎样才能做到这一点?
我尝试使用 TDeserializer,如下所示:
TProtocolFactory messageProtocolFactory = new TBinaryProtocol.Factory();
TDeserializer deserializer = new TDeserializer(messageProtocolFactory);
MyObject myObj = new MyObject();
deserializer.deserialize(myObj, objStr.getBytes(StandardCharsets.UTF_8));
但我收到错误:
org.apache.thrift.transport.TTransportException: Cannot read. Remote side has closed. Tried to read 2 bytes, but only got 0 bytes. (This is often indicative of an internal error on the server side. Please check your server logs.)
如何反序列化我的对象字符串?
错误的主要原因是您想要反序列化不适合
TBinaryProtocol
的数据。数据显然不是 Thrift 二进制格式。
由于您对这些数据字符串的来源提供的细节很少,因此答案也相当通用:您需要使用与数据最初生成方式相匹配的适当的反序列化方法。
据我所知,它不是 Thrift 附带的常见协议(二进制、紧凑、json)。因此,它要么是一些手工制作的 TProtocol 实现(对于 Thrift 来说是完全合法的),要么根本没有用 Thrift 进行序列化。