【问题标题】:Avro unions containing multiple arrays包含多个数组的 Avro 联合
【发布时间】:2018-08-04 19:57:41
【问题描述】:

我正在尝试在我们的软件中使用 C++ avro 库,但遇到了重大问题。我有一个包含一系列类型的“值”类,我想使用 avro 来读/写它。这不仅包括简单类型,还包括类型的 std::vectors、任意类等等。

我正在尝试为我的“值”类指定一个 avro 架构。在我的示例中,我将其限制为空、int、long、int 数组和 long 数组。

我的架构是一个包含两个字段的记录,一个标识包含的类型,一个用于保存包含的对象的联合。我拥有的架构如下...

{
    "type": "record",
    "name": "Value",
    "fields": [
        {
            "name": "ilk",
            "type": "string"
        },
        {
            "name": "contents",
            "type": [
                "null",
                "boolean",
                "int",
                {
                    "type": "array",
                    "items": "int"
                },
                "long",
                {
                    "type": "array",
                    "items": "long"
                }
            ]
        }
    ]
}

我没有指定 JSON,而是构建了一个打印出上述内容的 avro C++ 架构层次结构。但是,验证该架构层次结构失败。嗅探 C++ 代码,它会阻止您在联合中拥有多个数组或映射,即使数组或映射中的类型不同。

这实际上是 avro 标准的一部分还是 C++ 实现中的错误?我知道两次指定相同的类型是一件愚蠢的事情,但我没想到会允许包含不同类型的数组和映射。

【问题讨论】:

    标签: c++ avro


    【解决方案1】:

    我实际上不认为这是你想要做的。您要做的是创建一个具有不同类型的数组。像这样。

    {
      "namespace": "example.avro",
      "type": "record",
      "name": "Example",
      "fields": [
        {
          "name": "values",
          "type":
          {
            "type": "array",
            "items": ["int", "string"]
          }
        }
      ]
    }
    

    这将创建一个可以有两种简单类型的数组。 “int”或“string”。您可以在其中弹出任何复杂类型。

    【讨论】:

    • 这不适用于我们的内部类型系统,我通过将每个数组类型包装在一个虚拟记录中来解决它。
    【解决方案2】:

    在标准中找到了我的答案。一个联合中不能有多个数组或映射。

    对我来说听起来有些蹩脚,所以我必须找到一个肮脏的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 2019-06-20
      相关资源
      最近更新 更多