如何确定 thrift 消息的类型?

Posted

技术标签:

【中文标题】如何确定 thrift 消息的类型?【英文标题】:How to determine the type of thrift message? 【发布时间】:2021-12-27 20:30:26 【问题描述】:

我有一个管道有两种节俭消息进来

我可以尝试单独反序列化每一个,看看它是否会出错

TDeserializer deserializer = new TDeserializer(new TSimpleJSONProtocol.Factory());

try 
   Type1Msg t1 = new Type1Msg();
   deserializer.deserialize(t1, json, "UTF-8");
   return t1
 catch() 



try 
   Type2Msg t2 = new Type2Msg();
   deserializer.deserialize(t1, json, "UTF-8");
   return t2
 catch() 


有没有一种惯用的方法可以在 thrift 中实现反序列化多种消息类型?

【问题讨论】:

我从未使用过 Thrift,但快速浏览一下 Javadoc 建议您需要 TUnion ..但它的抽象和构造函数是受保护的;(;(;(并且 javadoc 很差) 如果,您知道(消息)类名,您可以使用TBase obj = (TBase) Class.forName(className).getConstructor().newInstance(); like here(eof) ..但您可能不知道!(?) 不同的方法:为什么你(只有)一个管道(/端点)用于两种消息类型!? ;)(如果您无法从“端点”推断,请选中从“消息/有效负载”推断它的选项) ..你分别用t1和/或t2做什么? 【参考方案1】:

我已经为 Python 回答了 over here,但实际上该主题与语言无关。

使用 Thrift union,或者带有非必填字段的 struct 也可以:

union varying 
  1 : Type1Msg msg1
  2 : Type2Msg msg2
  // room for more 

进一步阅读:

How do you say in a Thrift IDL that a client should include exactly one of a set of fields in a struct? THRIFT-409

【讨论】:

以上是关于如何确定 thrift 消息的类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定protobuf中的消息类型,以便我可以使用该类型.parsefrom(byte [])

Symfony Messenger 如何确定应由哪个处理程序处理每种类型的消息?

Thrift的TCompactProtocol紧凑型二进制协议分析

Thrift入门初探--thrift基础知识详解

thrift的TCompactProtocol紧凑型二进制协议分析

thrift数据类型科普