如何在Apache Avro for .NET中处理Schema循环类型引用?
解决Apache Avro .NET中循环引用Schema的解析问题
要处理循环引用的Avro Schema,关键是让两个Schema在同一个命名类型注册表中解析,这样解析器能在上下文里找到互相引用的类型。具体步骤如下:
核心方法:共享SchemaNames上下文
Avro .NET提供了SchemaNames类作为命名类型的注册表,解析多个关联Schema时,传入同一个SchemaNames实例,就能让解析器在解析过程中识别并关联循环引用的类型。
修改后的代码示例
var fooSchemaJson = File.ReadAllText("./Foo.avsc"); var barSchemaJson = File.ReadAllText("./Bar.avsc"); // 创建共享的Schema命名注册表 var sharedSchemaNames = new SchemaNames(); // 传入同一个SchemaNames实例解析两个Schema var fooSchema = Schema.Parse(fooSchemaJson, sharedSchemaNames); var barSchema = Schema.Parse(barSchemaJson, sharedSchemaNames); // 成功创建包含循环引用类型的联合Schema var combinedSchema = UnionSchema.Create(new List<Schema> { fooSchema, barSchema }, null);
原理说明
- 无参数的
Schema.Parse(string json)会创建独立的SchemaNames实例,导致两个Schema的解析上下文隔离,无法找到对方的类型。 - 共享
SchemaNames后,解析第一个Schema时,遇到未定义的MyNamespace.Bar会先在注册表中记录这个引用;当第二个Schema解析完成并注册到同一注册表后,第一个Schema的引用会自动绑定到已解析的Bar类型,完美解决循环引用问题。
这个方案完全符合AVRO-695和AVRO-1692中添加的循环引用支持特性,是官方推荐的处理方式。
内容的提问来源于stack exchange,提问作者Ctrotsky
相关产品推荐
相关产品推荐

