如何在 Apache Thrift 中表示可以不止一种类型的值?

How to represent values that can be of more that one type in Apache Thrift?

是否有可能使用 Thrift 来表示类似于 Java 类型 Map 的东西,其中 Map 中的值是已知的,例如字符串还是整数?

换句话说,是否有任何方法可以表示实际基类型仅在 运行 时已知但保证是预先已知的一组类型之一的值。

是否有高性能序列化的替代方案可以做到这一点?

我目前正在使用 JSON 手动实现 Java 和 Python 中的必要代码,但如果能以更有序的方式解决这个问题会更好。

Thrift 要求您指定类型。该类型可以是结构化类型,如 structunion,但它必须是类型:

union Anything {
  1: string s
  2: i64    i
  3: double d
}

service foo {
   Anything  bar(1: Anything anyArg)
}

但是,如果您打算使用 JSON 并且只是将 JSON 数据以某种方式包装到 Thrift 消息中,那么也许您想要使用 string。另一方面,如果你只交换像

这样的 JSON 字符串
service foo {
   string  bar(1: string json)
}

那么在某种程度上,这会引发一个问题,即 Thrift 是否是完成这项工作的正确工具。它可能仍然是,但你要对JSONserialization/deserialization自己负责...