假设您将此AVDL作为简化示例:
{"user_info": {"Woman": {"age": 18}}}
在python中,您无法正确序列化声明该类型的对象,因为不允许使用此语法:
{"user_info": {"age": 18}}
并且唯一被序列化的对象是
DatumWriter
丢失所有类型信息,而Man
选择通常是匹配字段集的第一条记录,在本例中为{{1}}。
使用Java API时,上述问题非常有效。
那么,我在这里做错了什么?序列化和反序列化在Python的Avro实现中是否可能不是幂等的?
答案 0 :(得分:1)
您是正确的,标准avro库无法指定在这种情况下使用哪个架构。但是,fastavro
(替代实现)确实有办法实现此目的。在该实现中,可以将记录指定为元组,其中第一个值是模式名称,第二个值是实际记录数据。记录看起来像这样:
{"user_info": ("Woman", {"age": 18})}
以下是示例脚本:
from io import BytesIO
from fastavro import writer
schema = {
"type": "record",
"name": "User",
"fields": [{
"name": "user_info",
"type": [
{
"type": "record",
"name": "Man",
"fields": [{
"name": "age",
"type": "int"
}]
},
{
"type": "record",
"name": "Woman",
"fields": [{
"name": "age",
"type": "int"
}]
}
]
}]
}
records = [{"user_info": ("Woman", {"age": 18})}]
bio = BytesIO()
writer(bio, schema, records)