我正在使用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
字段包含一个Student对象。但是,当我编译代码时,我得到了UnresolvedUnionException。它抱怨other
模式的School
字段的并集数据类型。似乎无法解析我在Java代码中设置为student
的school
。为什么会有这种例外? Stacktrace是:
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-搜索字符串数组中的字符串 - java在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…
Java Double与BigDecimal - java我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…
当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…
如何通过kafka流加入主题 - java卡夫卡流我正在尝试流式传输,但存在一些问题,它不起作用。首先,我有3个连接器,但不能使用自己的钥匙。我需要钥匙才能加入它们,对不对?如何使用2个或更多钥匙加入?我尝试复制这样的内容: 选择*从(选择a。*从用户a内部联接部门b 在a.dep = b.dep和a.group = b.group上 )a.id = b.id上的内部联接user_afy我想将内部联…
Java-父类正在从子类中调用方法? - java抱歉,我还是编码的新手,可能还没有掌握所有术语。希望您仍然能理解我的问题。我想得到的输出是:"Cost for Parent is: 77.77" "Cost for Child is: 33.33" 但是,我得到这个:"Cost for Parent is: 33.33" "Cost f…