使用Microsoft-Avro-Core序列化时Avro schema丢失namespace属性如何解决
问题原因
Microsoft.Avro.Core库默认从C#类型自动推导Avro Schema时,会将嵌套记录的命名空间与名称合并为全限定名字符串赋值给name字段,直接丢弃独立的namespace字段,该行为没有公开的序列化开关可以直接修改。
解决方案
方案1:使用预定义Schema(推荐)
直接传入你完整的带namespace属性的原Schema,跳过库自动推导Schema的环节,100%保留Schema配置:
// 你的原始带namespace的Schema定义 string predefinedSchema = @" { ""name"": ""typeName"", ""type"": [ { ""type"": ""record"", ""name"": ""recordName"", ""namespace"": ""topLevelRecord.record_data"", ""fields"": [ // 按实际需求补充字段定义 ] }, ""null"" ] }"; // 加载预定义Schema var avroSchema = Avro.Schema.Parse(predefinedSchema); var serializeSettings = new AvroSerializationSettings(); // 初始化SequentialWriter时显式传入预定义Schema using var fileStream = File.OpenWrite("output.avro"); using var writer = AvroContainer.CreateSequentialWriter<YourBusinessType>(avroSchema, fileStream, Codec.Deflate, serializeSettings); // 写入记录逻辑 writer.Write(yourDataInstance);
方案2:通过特性标注命名空间
如果需要从C#类自动生成Schema,使用库原生的AvroRecord特性标注,不要用DataContract特性:
// 注意特性所属命名空间:旧版本在Microsoft.Hadoop.Avro,新版本在Microsoft.Avro.Core [AvroRecord(Namespace = "topLevelRecord.record_data")] public class RecordName { // 按需求补充字段属性 }
该特性指定的Namespace会被序列化器识别为独立的namespace字段输出,不会合并到name属性中。如果你的顶层类型嵌套了该记录类型,需要确保嵌套的所有自定义记录类型都加上对应的AvroRecord特性配置。
内容的提问来源于stack exchange,提问作者tsage080667
相关产品推荐
相关产品推荐

