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

如何在C#中用Apache.Avro NuGet包解析嵌套Avro Schema引用

如何在C#中使用Apache.Avro解析多文件Avro Schema?

问题背景

我正在开发一个C#项目,使用Apache.Avro NuGet包读取和验证Avro Schema。现有两个Schema文件:address.avsc定义了带命名空间的Address记录,sample.avsc通过命名空间限定名称net.common.events.Address引用这个Address类型。但直接解析sample.avsc时,抛出错误:

'type' was not found for field name at field[pos]

相关文件内容

address.avsc

{
  "type": "record",
  "name": "Address",
  "namespace": "net.common.events", 
  "fields": [
    { "name": "address1", "type": ["null", "string"], "default": null },
    { "name": "city", "type": ["null", "string"], "default": null },
    { "name": "state", "type": ["null", "string"], "default": null },
    { "name": "zip", "type": ["null", "string"], "default": null } 
  ]
}

sample.avsc

{
  "type": "record",
  "name": "Sample",
  "namespace": "net.common.events",
  "doc": "Sample data for testing",
  "fields": [
    { "name": "first_name", "type": "string" },
    { "name": "last_name", "type": "string" },
    { "name": "email_address", "type": "string" },
    {
      "name": "address",
      "type": "net.common.events.Address"
    }
  ]
}

原解析代码

string avroSchema = File.ReadAllText("sample.avsc");
var schema = (RecordSchema)Schema.Parse(avroSchema);

解决方案

方法一:使用Apache.Avro内置的SchemaResolver手动加载依赖Schema

Apache.Avro本身支持多文件Schema解析,但不会自动扫描和加载依赖文件,需要手动将所有依赖的Schema加载到SchemaResolver中,再用这个解析器处理主Schema。

修改后的代码示例:

// 1. 加载所有依赖的Schema文件
var addressSchemaText = File.ReadAllText("address.avsc");
var sampleSchemaText = File.ReadAllText("sample.avsc");

// 2. 创建SchemaResolver并添加已解析的依赖Schema
var resolver = new SchemaResolver();
var addressSchema = Schema.Parse(addressSchemaText, resolver);
resolver.AddSchema(addressSchema);

// 3. 使用同一个解析器解析主Schema
var sampleSchema = (RecordSchema)Schema.Parse(sampleSchemaText, resolver);

原理:SchemaResolver会维护一个已解析Schema的注册表,当解析主Schema遇到引用类型时,会从注册表中查找对应的类型定义,避免找不到类型的错误。

方法二:使用第三方库简化多文件Schema处理

如果不想手动管理依赖加载,可以考虑使用Confluent.Avro NuGet包,它对多文件Schema的处理更友好,支持自动解析引用的类型(前提是所有Schema文件在同一目录或可被扫描到)。

示例代码(Confluent.Avro):

using Confluent.Avro;

var schemaRegistry = new SchemaRegistry();
// 注册所有Schema文件
schemaRegistry.AddSchemaFromFile("address.avsc");
var sampleSchema = schemaRegistry.GetSchema("net.common.events.Sample");

总结

  • Apache.Avro本身可以处理多文件Schema,核心是通过SchemaResolver手动管理依赖Schema的加载。
  • 若追求更便捷的体验,Confluent.Avro等第三方库提供了更自动化的Schema依赖处理能力。

内容的提问来源于stack exchange,提问作者Roshan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 17:28:22