如何确定 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紧凑型二进制协议分析