如何在Java中处理Avro工会类型数组?

时间:2012-11-06 02:03:25

标签: java avro

我使用IDL定义的Avro架构看起来类似于以下内容:

protocol MyProtocol {
  record Gizmo {
    string name;
    int cost;
    int weight;
  }

  record Gadget {
    string name;
    int cost;
    double width;
    double height;
  }

  record Order {
    long id;
    array<union{Gizmo, Gadget}> items;
  }
}

我正在使用此架构中自动生成的Java类。除了可以在items数组中的Gizmos和Gadgets之外,还有更多类型,但是我们要求所有类型都有名称和成本。

根据我的理解,没有办法为Avro记录指定继承,因此Order对象上的getItems()必然会给我List<Object>。也就是说,我想要一些具有更多背景和类型安全性的东西;到目前为止,我已经提出了三种方法,但它们似乎都不太合适。

方法1:List<SpecificRecord>执行未经检查的转换(实际上是对List的转换,然后是另一个转换为List<SpecificRecord>,因为泛型工作原理)并使用get(int field),知道名称和费用将分别为字段1和2。一旦我得到那些,我也必须将它们转换为适当的类型。这似乎非常脆弱。

方法2:迭代items数组,并逐个转换每个项目。我可以转换为SpecificRecord并在第一种方法中使用索引get,或执行一系列instanceof检查,然后按名称获取字段。这要么是脆弱的,要么是费力的。

方法3:编写我自己的实现SpecificRecord的类并具有适当的类层次结构。这会失去自动生成代码的好处,但似乎也是最强大的选择,但也非常费力。

哪一项最好?或者有更好的选择吗?

0 个答案:

没有答案