当属性匹配时,如何使用Python序列化Avro中的union字段

2024-09-27 21:30:52 发布

您现在位置:Python中文网/ 问答频道 /正文

假设您有一个简化的AVDL示例:

@namespace("example.avro")
protocol User {
   record Man {
      int age;
   }

   record Woman {
      int age;
   }

   record User {
      union {
        Man,
        Woman
      } user_info;
   }
}

在python中,不能正确序列化声明类型的对象,因为不允许使用以下语法:

^{pr2}$

唯一被序列化的对象是

{"user_info": {"age": 18}}

丢失所有类型信息和DatumWriter选择通常与字段集匹配的第一条记录,在本例中是Man。在

在使用javaapi时,上述问题可以很好地解决。在

那么,我做错什么了?在Python的Avro实现中,序列化和反序列化是否可能不是幂等的?在


Tags: 对象info示例age序列化examplerecordnamespace
1条回答
网友
1楼 · 发布于 2024-09-27 21:30:52

您是正确的,标准avro库没有办法指定在这种情况下使用哪个模式。但是,^{}(另一种实现)确实有办法做到这一点。在该实现中,可以将记录指定为元组,其中第一个值是模式名,第二个值是实际的记录数据。记录如下:

{"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)

相关问题 更多 >

    热门问题