【问题标题】:How do you say in a Thrift IDL that a client should include exactly one of a set of fields in a struct?您如何在 Thrift IDL 中说客户端应该在结构中包含一组字段中的一个?
【发布时间】:2013-09-26 05:12:00
【问题描述】:

假设我在一个包含两个字段的 Apache Thrift IDL 文件中定义了一个结构。例如:

struct Thing {
  1: optional string name,
  2: optional i32 size
}

这意味着客户端可以提供没有字段、名称、大小或名称和大小的事物对象。但是,如果我想要一个 Thing 对象具有 either 名称 大小(异或)怎么办?目前我必须使用我的实现代码来防止客户端提供没有字段或两个字段的事物;并记录/评论客户应如何指定事物对象。

简而言之,如果有人定义了一个包含各种字段的结构,是否可以在IDL 本身中表达您只希望只提供这些字段中的一个在客户端? (我使用的是 Apache Thrift 0.9.0。)如果您能说出类似以下内容(| = 或),那就太好了:

struct Thing {
  1: required (string name | i32 size)
}

【问题讨论】:

    标签: thrift


    【解决方案1】:

    使用联合:

    union Thing {
      1: string name,
      2: i32 size
    }
    

    Optional 可以省略,required 不允许/对联合有用。

    在 0.9.0 (IIRC) 中引入了联合,但 0.9.1 改进了对它们的支持。

    【讨论】:

    • 好的,谢谢,我不知道 Thrift 中的工会。它们看起来很有用。如果我可以问 3 个后续问题:1)如果我使用联合,如果 Thrift 服务收到未设置名称或大小字段的事物,它会自动抛出异常吗? 2) Thrift 0.9.1 中哪些语言支持“联合”?我正在使用 Java、C# 和 Python,所以这三个都需要使用联合类型。 3) “union”的使用有什么限制吗?我真正想做的是定义一个结构,其中一个字段将是一个类型,它是一个枚举和另一个结构类型的联合。我希望这是有道理的!
    • (1) 好问题。在没有查看源代码的情况下,IIRC Java 会抱怨,但其他语言不会。所以你应该自己检查一下。
    • (3) 你定义 Union 就像一个结构。事实上,那些原生不支持联合的语言会为结构生成代码。
    • (2) 或多或少都是。有些是本地的,有些是通过结构的。
    • 好的,非常感谢@JensG。对(1)感到羞耻,因为避免编写这样的保护代码是吸引力的一部分。但是,我仍然很想尝试使用工会。至少联合类型在 IDL 本身中表达了我想要的语义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2016-05-31
    相关资源
    最近更新 更多