我正在使用Apache Avro用于对象序列化。
我有一个用于 School
对象的 Avro 架构:
{"namespace": "com.my.model",
"type": "record",
"name": "School",
"fields": [
{"name": "sid", "type": "int"},
{"name": "size", "type": "long"},
{"name": "other", "type": ["null", "Teacher", "Student"]}
]
}
如上所示,"other"
字段保存联合数据类型,它可以是 null
或 Teacher
实例或 Student
实例。
教师对象架构:
{"namespace": "com.my.model",
"type": "record",
"name": "Teacher",
"fields": [
{"name": "isMale", "type": "boolean"}
]
}
学生对象架构:
{"namespace": "com.my.model",
"type": "record",
"name": "Student",
"fields": [
{"name": "age", "type": "int"}
]
}
我使用 Avro 工具编译了上述架构,Avro 自动为我生成了所有 Java 类。
然后,在我的 java 程序中,我通过以下方式创建 School
实例:
School school = new School();
school.setSid(3);
school.setSize(2000);
//create a student object
Student student = new Student();
student.setAge(18);
//set student into school instance
school.setOther(student);
如上所示,学校实例的 other
字段包含一个学生对象。然而,当我编译代码时,我得到了 UnresolvedUnionException 。它提示 School
架构的 other
字段的联合数据类型。似乎无法解析我在 Java 代码中设置为 school
的 student
。为什么会出现这个异常呢?堆栈跟踪是:
org.apache.avro.UnresolvedUnionException: Not in union ["null",{"type":"record","name":"Student","namespace":"com.my.model","fields":[{"name":"age","type":"long"}]},{"type":"record","name":"Teacher","namespace":"com.model","fields":[{"name":"isMale","type":"boolean"}]}]: false
at org.apache.avro.generic.GenericData.resolveUnion(GenericData.java:561)
at org.apache.avro.generic.GenericDatumWriter.resolveUnion(GenericDatumWriter.java:144)
at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:71)
at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:106)
at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:66)
at org.apache.avro.generic.GenericDatumWriter.writeArray(GenericDatumWriter.java:131)
at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:68)
at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:73)
at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:106)
at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:66)
at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:58)
最佳答案
我可能会弄错,但我认为 Union 类型应该只包含一个非默认值:
{
"name": "other",
"type": [
"null",
"Teacher",
"Student"
]
}
应该是:
{
"name": "other",
"type": [
"null",
{
"name": "Visitors",
"symbols": [
"Student",
"Teacher"
],
"type": "enum"
}
]
}
关于java - Apache 阿夫罗 : UnresolvedUnionException when using union data type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20333389/