我有以下代码将对象序列化为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是否会有这样的解决方案,因为它看起来并不常见?
答案 0 :(得分:0)
循环引用请求已在AVRO-695中完成,修复已通过AVRO-1692提交
可以在TestCircularReferences.java
找到相同的测试请注意,Hive现在支持模式中的循环引用以及HIVE-7653