使用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
相关产品推荐
相关产品推荐

