关于Python序列化/反序列化的Q

2024-05-16 02:45:55 发布

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

我有多少机会实例化、保留和序列化/反序列化二进制数据Python类(从rfc2246[TLS]采用)来反映这种模式:

   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;

基本上,我必须定义一个(variant)类VariantRecord,它根据VariantTag的值而变化。没那么难。挑战在于找到一种最通用的方法来构建一个类,该类在字节流之间进行序列化/反序列化。。。Pickle,Google协议缓冲区,marshal都不是一个选项。在

在我的类中有一个显式的“def serialize”没有取得什么成功,但是我对它不太满意,因为它不够通用。在

我希望我能表达这个问题。在

如果VariantTag=apple当前的解决方案是这样的,但我不太喜欢它

^{pr2}$

问候


Tags: numberapplestring序列化taglengthstructv2
1条回答
网友
1楼 · 发布于 2024-05-16 02:45:55

两个建议:

  1. 对于可变长度结构,请使用固定格式 把结果切成薄片。在
  2. 使用结构。结构在

例如,如果我正确地理解了您的格式(您的示例中出现的长度字节,但在另一个变体中最初没有提到的长度字节是否也存在?)在

>>> import binascii
>>> import struct
>>> V1 = struct.Struct(">H10p")
>>> V2 = struct.Struct(">L10p")
>>> def serialize(variant, n, s):
    if variant:
        return V2.pack(n,s)
    else:
        return V1.pack(n,s)[:len(s)+3]


>>> print binascii.hexlify(serialize(False, 10, 'hello')) #V1
000a0568656c6c6f
>>> print binascii.hexlify(serialize(True, 10, 'hello')) #V2
0000000a0568656c6c6f00000000
>>> 

相关问题 更多 >