【问题标题】:How to handle objects with circular reference in Avro如何在 Avro 中处理具有循环引用的对象
【发布时间】:2014-04-19 04:33:34
【问题描述】:

我有以下代码将对象序列化为 Avro。

List childrenList = new ArrayList ();
RootNode root = new RootNode();
root.setChildrenList(childrenList);

ChildNode child1 = new ChildNode();
child1.setParent(root);
childrenList.add(child1);

ChildNode child2 = new ChildNode();
child2.setParent(root);
childrenList.add(child2);

Schema schema = ReflectData.AllowNull.get().getSchema(root.getClass());
DatumWriter datumWriter = new ReflectDatumWriter (root.getClass());
DataFileWriter fileWriter = new DataFileWriter (datumWriter);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
fileWriter.create(schema, baos);
fileWriter.append(root);

但是由于根和子之间的循环引用,这进入了无限循环。

最终,Apache Avro 因 stackoverflow 错误而失败。

我到处搜索了很多,但似乎没有任何选项可以解决此问题。

有人知道如何让 Avro 处理循环引用吗?

更新:我知道另外两个序列化程序框架 - Gson 和 Jackson,只有 Jackson 可以很好地处理循环引用。所以我怀疑 Avro 是否会为此提供解决方案,因为它看起来并不常见?

【问题讨论】:

    标签: java serialization avro


    【解决方案1】:

    循环引用请求已在 AVRO-695 中完成,并且已通过 AVRO-1692 提交修复

    可以在TestCircularReferences.java找到相同的测试

    请注意,Hive 现在也支持架构中的循环引用,HIVE-7653

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 2011-04-12
      • 2012-01-17
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多