.NET Core 2.0 Avro代码生成器无法处理嵌套结构及IDL问题咨询
解决Microsoft.Hadoop.Avro.Utils嵌套记录生成与Avro IDL支持问题
一、先搞定嵌套Avro JSON Schema生成C#类的问题
你说的嵌套记录处理不了,大概率是JSON Schema的定义没符合Avro的规范,我给你举个正确的嵌套结构示例:
比如我们定义一个包含嵌套用户信息的订单Schema:
{ "type": "record", "name": "Order", "namespace": "AvroDemo.Models", "fields": [ {"name": "OrderId", "type": "string"}, {"name": "Customer", "type": { "type": "record", "name": "Customer", "fields": [ {"name": "Id", "type": "string"}, {"name": "Name", "type": "string"} ] }} ] }
然后用Microsoft.Hadoop.Avro.Utils里的AvroGenerator.Generate方法来生成类,代码大概是这样:
using Microsoft.Hadoop.Avro.Utils; using System.IO; var schemaJson = File.ReadAllText("order-schema.json"); var generator = new AvroGenerator(); var csharpCode = generator.Generate(schemaJson, "AvroDemo.Models"); File.WriteAllText("Order.cs", csharpCode);
这样生成的C#类会自动包含嵌套的Customer类,你可以检查下自己的Schema是不是没正确嵌套,或者存在命名空间/名称冲突的问题。
二、关于Avro IDL的支持情况
遗憾的是,Microsoft.Hadoop.Avro.Utils这个库原生并不支持直接解析Avro IDL格式,官方文档确实没这块的说明,我之前查过相关的issue和源码,这个库主要是针对JSON Schema做处理的。
不过你可以用曲线救国的方式:
- 先用Avro官方工具(比如
avro-tools.jar)把IDL文件转换成JSON Schema,命令大概是:java -jar avro-tools.jar idl2json your-schema.avdl your-schema.json - 然后再用
Microsoft.Hadoop.Avro.Utils基于转换后的JSON Schema生成C#类,这样就能复用IDL的结构复用能力了。
另外,如果你想直接用IDL生成C#类,也可以考虑用其他第三方库,比如Apache.Avro(官方的.NET实现),它支持直接从IDL生成代码,不过需要注意它和Microsoft.Hadoop.Avro的兼容性,毕竟是不同的库。
内容的提问来源于stack exchange,提问作者aweis
相关产品推荐
相关产品推荐

