【问题标题】:How to determine the type of thrift message?如何确定 thrift 消息的类型?
【发布时间】: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做什么?

标签: java thrift


【解决方案1】:

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

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

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

进一步阅读:

【讨论】:

    猜你喜欢
    • 2019-06-02
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多