Sto scrivendo un codice di serializzazione e mi sto chiedendo come gestire i dati binari. Come lo sto facendo in Python, il mio obiettivo è renderlo molto semplice, non richiede un sacco di overhead del programmatore, ecc.
Tre opzioni che sto considerando:
-
I campi che saranno dati binari sono rappresentati come stringhe con codifica esadecimale. Quindi avresti qualcosa di simile:
obj = { 'foo': 100, 'bar': [1, 2, 3, 4], 'baz': "ab0123ffbbaa55", } ObjectSpec.loads(ObjectSpec(obj).dumps())
ObjectSpec
è la classe che determina come serializzare l'oggetto.- I pro: è facile da guardare, facile da creare oggetti letterali, facile da stampare.
- Gli svantaggi: devi ricordarti di codificare in modo esadecimale i campi. Se hai dei byte, devi codificarli esadecimali prima del codice di serializzazione, quindi hex-decodificali. Se vuoi memorizzare gli oggetti, c'è un sovraccarico a meno che non decifri prima le stringhe.
-
I campi sono stringhe di byte, ad esempio,
obj = { 'foo': 100, 'bar': [1, 2, 3, 4], 'baz': '\xab\x01#\xff\xbb\xaaU', }
- I pro: meno overhead, sia nello spazio, sia nel non dover codificare hex se hai già byte.
- I contro: più difficile da fare letterali, più difficile da stampare. Se accidentalmente lasci una stringa con codifica esadecimale, serializzerà la cosa sbagliata (la rappresentazione esadecimale invece della cosa stessa).
-
I campi dati binari usano un tipo personalizzato, ad es.
bson.Binary
:from bson import Binary obj = { 'foo': 100, 'bar': [1, 2, 3, 4], 'baz': Binary('\xab\x01#\xff\xbb\xaaU'), }
- I pro: come il n. 2, ma delinea chiaramente anche i tipi binari.
- I contro: come il n. 2, ad eccezione di più difficile per codificare accidentalmente la cosa sbagliata. Richiede il wrapping dei dati in un tipo solo per ottenere il codice di serializzazione per accettarlo, invece di lasciare i byte in.
Quale sarebbe l'approccio più sensato? C'è un'altra variante che è meglio?