как использовать avro с python для сериализации словаря и записи в байтах в bytesio для правильного чтения и десериализации со схемой? - PullRequest
0 голосов
/ 03 апреля 2020

Я хочу использовать 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 отдельно.

...