我正在使用Apache.Avro包从一些Avro模式生成一些C#.我有共享公共构建块(如Enum定义)的不同架构.
我遇到了对公共共享模式的引用不能正确解析的问题.
以下是在一个文件中定义的模型:
{
"name": "MyModel",
"namespace": "My.Model",
"type": "record",
"fields": [
{
"name": "Planet",
"type": "My.Model.PlanetEnum",
}
]
}
以下是My.Model.PlanetEnum
的定义,它将在多个车型之间共享:
{
"name": "PlanetEnum",
"namespace": "My.Model",
"type": "enum",
"symbols": [
"Earth",
"Mars"
]
}
下面是我用来生成模式的C#:
var codeCompileUnit = new CodeGen
{
Schemas =
{
/* generation fails even if I include the enum definition inline here
Schema.Parse("""
{
"name": "PlanetEnum",
"namespace": "My.Model",
"type": "enum",
"symbols": [
"Earth",
"Mars"
]
}
"""),
*/
Schema.Parse(schemaText)
},
}.GenerateCode();
var stringWriter = new StringWriter(new StringBuilder());
var provider = CodeDomProvider.CreateProvider("csharp");
provider.GenerateCodeFromCompileUnit(codeCompileUnit, stringWriter, new CodeGeneratorOptions());
var schemaCode = stringWriter.ToString();
return schemaCode;
我得到的错误是:
Avro.SchemaParseException: Undefined name: My.Model.PlanetEnum at 'fields[0].type'
at Avro.Schema.ParseJson(JToken jtok, SchemaNames names, String encspace)
at Avro.RecordSchema.createField(JToken jfield, Int32 pos, SchemaNames names, String encspace)
at Avro.RecordSchema.NewInstance(Type type, JToken jtok, PropertyMap props, SchemaNames names, String encspace)
at Avro.NamedSchema.NewInstance(JObject jo, PropertyMap props, SchemaNames names, String encspace)
at Avro.Schema.ParseJson(JToken jtok, SchemaNames names, String encspace)
at Avro.Schema.Parse(String json, SchemaNames names, String encspace)
at Avro.Schema.Parse(String json)