Я хочу использовать avro для сериализации словаря, чтобы создать строку байтов, записать ее в io.BytesIO, прочитать ее и десериализовать.
Q1: загрузить схему из файла avro как avro.schema.RecordSchema
или могу загрузить его из json файла как json with json.load
?
Q2: когда используется BytesIO
, я должен сделать seek(0)
?
Q3: я использую BytesIO
, чтобы передать сериализованную строку тестирования, чтобы прочитать ее и десериализовать. Я хочу сделать это в памяти, поэтому я не пишу / читаю файл. это нормально?
import io
import json
import avro.io
import avro.schema
msg = {"name": "foo", "favorite_number": 1, "favorite_color": "pink"}
with open("schema", "rb") as f:
SCHEMA = avro.schema.parse(f.read())
writer = avro.io.DatumWriter(SCHEMA)
bytes_writer = io.BytesIO()
encoder = avro.io.BinaryEncoder(bytes_writer)
writer.write(msg, encoder)
b = bytes_writer.getvalue()
reader = avro.io.DatumReader(SCHEMA)
bytes_reader = io.BytesIO(b)
decoder = avro.io.BinaryDecoder(bytes_reader)
deserialized_json = reader.read(decoder)
РЕДАКТИРОВАТЬ:
Документация содержит пример с serde и файл записи / чтения. https://avro.apache.org/docs/1.8.2/gettingstartedpython.pdf
Они используют DataFileWriter
, и это делает
verify that the items we write are valid items and write the appropriate fields.
в соответствии с документацией. если я не использую его и использую DatumWriter только для записи в BytesIO, я все делаю хорошо? В документации сказано, что я могу использовать DatumWriter отдельно.