Quelles sont les chances que je dois instancier, garder et linéariser/désérialiser à/de classes Python de données binaires reflétant ce modèle (adopté à la RFC 2246 [TLS]):Q sur sérialisation Python/désérialisation
enum { apple, orange } VariantTag;
struct {
uint16 number;
opaque string<0..10>; /* variable length */
} V1;
struct {
uint32 number;
opaque string[10]; /* fixed length */
} V2;
struct {
select (VariantTag) { /* value of selector is implicit */
case apple: V1; /* VariantBody, tag = apple */
case orange: V2; /* VariantBody, tag = orange */
} variant_body; /* optional label on variant */
} VariantRecord;
Fondamentalement Je devrais définir une classe (variante) VariantRecord, qui varie en fonction de la valeur de VariantTag. Ce n'est pas si difficile. Le défi consiste à trouver la manière la plus générique de construire une classe, qui sérialise/désérialise vers et à partir d'un flux d'octets ... Pickle, tampon de protocole Google, marshal n'est pas une option.
J'ai eu peu de succès en ayant une "sérialité sérielle" explicite dans ma classe, mais je ne suis pas très content, parce que ce n'est pas assez générique.
J'espère pouvoir exprimer le problème.
Ma solution actuelle en cas VariantTag = pomme devrait ressembler à ceci, mais je ne l'aime pas trop
import binascii
import struct
class VariantRecord(object):
def __init__(self, number, opaque):
self.number = number
self.opaque = opaque
def serialize(self):
out = struct.pack('>HB%ds' % len(self.opaque), self.number, len(self.opaque), self.opaque)
return out
v = VariantRecord(10, 'Hello')
print binascii.hexlify(v.serialize())
>> 000a0548656c6c6f
Cordialement
Pourquoi n'êtes-vous pas heureux avec elle? –
Quel est le problème avec le cornichon? Pourquoi vous souciez-vous des méthodes quelque peu ésotériques d'utiliser C++ lorsque vous utilisez Python? Qu'aimeriez-vous avoir? Il semble que vous souhaitiez une méthode dense pour stocker des données, mais il est difficile de dire ce que vous essayez réellement de généraliser. – Bear
Je dois mettre en œuvre http://zinfandel.levkowetz.com/html/draft-ietf-p2psip-base-08. J'espère que tout dit. Je dois respecter le protocole de ligne, qui est binaire, mais pas conforme au pickle. Je ne suis pas content, parce que ce n'est pas assez générique :) – neil