Apache Thrift 是不是提供反射 API?

Posted

技术标签:

【中文标题】Apache Thrift 是不是提供反射 API?【英文标题】:Does Apache Thrift provide reflection API?Apache Thrift 是否提供反射 API? 【发布时间】:2014-10-22 03:42:57 【问题描述】:

thrift 是否提供了一种在运行时检查结构字段的方法?

我的用例是 C#,但问题是关于标准 Thrift API。

【问题讨论】:

没有专门的 Thrift 反射 API。 Thrift 结构没有特殊的魔法。这取决于语言/环境是否支持反射。某些语言实现了某种对属性的通用访问,如果您的运行时不支持它,这可能是最接近的。 我试图找出标准.NET反射无法解决的您想要解决的问题。到目前为止没有运气。你能帮帮我吗? 假设您想在 SQL 表中存储一个节俭结构。我想将数字和字符串字段存储为列,其余作为 JSON 存储在特殊列中。我可以使用反射来列出将映射到列中的字段。 【参考方案1】:

没有跨语言的标准 thrift API,因此您可以在序列化之外执行的操作高度依赖于语言。如果仅使用反射无法完成您想要的操作,请检查 thrift 编译器为您感兴趣的 thrift 对象生成的代码。我没有看到 C# thrift 生成的代码,但它可能包含可能包含的其他数据对你有用。

我对 Java 实现非常熟悉,我可以告诉你,在 Java 中使用 thrift 根本不需要使用反射。每个 thrift 生成的类都包含允许反序列化器从字段 id 编号重建类的信息。 java thrift 编译器创建静态成员和方法,其中包含几乎所有你想要的东西。对于 Java,它实际上比反射更好,因为它包含列表/映射/集合的元素类型。

现在不能保证这些数据的格式在未来版本的 thrift 中不会改变,但鉴于所有各种协议都依赖于它们,“隐藏”API 应该相当稳定。

【讨论】:

【参考方案2】:

如果您可以在运行时访问 IDL,则可以使用 IDL 解析器并以此方式推断生成的字段。

我不是 C# 方面的专家,但您可以链接到 Thrift 可执行文件中使用的本机 libparse 库(我不确定 parse 库是否足够通用,可以这样使用,我只是假设) .

您也可以使用 Facebook Swift 中的解析器(https://github.com/facebook/swift/tree/master/swift-idl-parser,或从 http://central.maven.org/maven2/com/facebook/swift/swift-idl-parser/0.13.2/swift-idl-parser-0.13.2.jar 下载 JAR)。这对于您的情况 IMO 可能更容易或更好,即使它是一个 Java 库,我认为它应该使用 IKVM.net 很好地转换为 CLR。​​

第三种简单粗暴的方法是使用 Thrift html 生成器生成 HTML 文档并使用正则表达式解析该文档或通过 HTML Tidy 运行它并将其解析为 XML

【讨论】:

解析器是一个 flex/bison 的东西。不知道你所说的 libparse 库是什么意思? 当你构建 thrift 时,它会在 compiler/cpp 目录中输出一个名为 libparse.a 的静态库。就像我说的那样,我不确定它是否设计为独立于 thrift 可执行文件使用,但它似乎存在。

以上是关于Apache Thrift 是不是提供反射 API?的主要内容,如果未能解决你的问题,请参考以下文章

Apache Avro 与 Thrift 比较

Apache Thrift TSimpleServer 是不是丢弃请求?

Apache Thrift 仅用于处理,而不是服务器

apache thrift 中是不是有类似的导入语句?

对 Apache Thrift 生成的代码进行单元测试是不是有必要?

Apache Thrift 加密 - Java