Avro Schema生成字段按字母序排列不符合预期问题咨询
Avro反射生成Schema字段顺序与Java类定义不符的原因
问题场景
Java类定义
public class MonitorStateSchema { private MetaResponse c; private Header a; private MonitorStateEnvelope b; public MonitorStateSchema(MetaResponse c, Header a, MonitorStateEnvelope b) { this.c = c; this.a = a; this.b = b; } }
Schema生成代码
public static <D> void getFromAvro(Class<D> schemaType) { Schema schema = ReflectData.get().getSchema(schemaType); // other stuff }
问题现象
通过上述代码生成的Avro Schema中,字段按字母序排列为a、b、c,但Java类定义的字段顺序是c、a、b,导致反序列化字节数组时程序异常。
原因分析
- 默认情况下,Avro的
ReflectData组件通过反射解析Java类时,会按照字段名称的字母顺序排序生成Schema的字段列表,而非遵循Java类中字段的定义顺序。 - 这是因为
ReflectData内部收集完类的所有字段后,会对字段名称做字典序排序,再以此顺序构建Schema结构。 - 当序列化与反序列化使用的Schema字段顺序不一致时,Avro会因字段位置不匹配导致反序列化逻辑出错,触发程序异常。
内容的提问来源于stack exchange,提问作者Luiz Henrique
相关产品推荐
相关产品推荐

