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

使用Apache.Avro.Tools(avrogen)生成引用Schema的C#类时遇未定义错误

解决AvroGen引用外部Schema生成C#类的问题

问题根源

报错是因为AvroGen解析sample.avsc时,无法正确关联net.common.events.Address的命名空间定义,即便同时传入两个文件,工具的解析顺序或命名空间映射逻辑也需要调整。

可行解决方案

1. 确保Schema命名空间与引用匹配

两个Schema文件的命名空间必须一致,且sample.avsc中对Address的引用要完整对应其命名空间:

  • address.avsc 示例:
{
  "type": "record",
  "name": "Address",
  "namespace": "net.common.events",
  "fields": [
    {"name": "street", "type": "string"},
    {"name": "city", "type": "string"}
  ]
}
  • sample.avsc 示例:
{
  "type": "record",
  "name": "Sample",
  "namespace": "net.common.events",
  "fields": [
    {"name": "id", "type": "int"},
    {"name": "address", "type": "net.common.events.Address"}
  ]
}

2. 调整命令行参数顺序

AvroGen对Schema文件的传入顺序敏感,需先传入被依赖的Schema(address.avsc),再传入依赖它的Schema(sample.avsc),同时指定输出目录:

avrogen -s address.avsc -s sample.avsc ./output

这样工具会先解析Address的定义,处理Sample时就能找到对应类型。

3. 合并Schema到单个文件(应急方案)

如果前两种方法无效,可将两个Schema合并到同一个.avsc文件中,用数组包含两个记录定义:

[
  {
    "type": "record",
    "name": "Address",
    "namespace": "net.common.events",
    "fields": [{"name": "street", "type": "string"}, {"name": "city", "type": "string"}]
  },
  {
    "type": "record",
    "name": "Sample",
    "namespace": "net.common.events",
    "fields": [{"name": "id", "type": "int"}, {"name": "address", "type": "net.common.events.Address"}]
  }
]

执行命令生成类:

avrogen -s combined.avsc ./output

验证结果

执行命令后,检查输出目录,确认生成Address.cs和Sample.cs两个文件,且Sample类中包含类型为Address的字段。

内容的提问来源于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:27:42