如何在Avro中处理具有循环引用的对象

时间:2014-03-14 03:31:17

标签: java serialization avro

我有以下代码将对象序列化为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);

但由于root和children之间的循环引用,这会进入无限循环。

最终,Apache Avro因堆栈溢出错误而失败。

我到处搜索了很多,但似乎没有任何选择来解决这个问题。

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

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

1 个答案:

答案 0 :(得分:0)

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

可以在TestCircularReferences.java

找到相同的测试

请注意,Hive现在支持模式中的循环引用以及HIVE-7653