You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 21:46:04