关于Python序列化/反序列化的问题
我有多少机会实例化、保留和序列化/反序列化到/从二进制数据Python类,以反映此模式(采用自RFC 2246[TLS]): 关于两项建议:关于Python序列化/反序列化的问题,python,serialization,binary,Python,Serialization,Binary,我有多少机会实例化、保留和序列化/反序列化到/从二进制数据Python类,以反映此模式(采用自RFC 2246[TLS]): 关于两项建议: 对于可变长度结构,请使用固定格式 然后把结果切成薄片 使用struct.struct e、 g.如果我正确理解了您的格式(在您的示例中出现但在另一个变体中最初没有提到的长度字节是否也存在?) 你为什么不满意?泡菜怎么了?在使用Python的时候,你为什么会关注一些使用C++的深奥方法?你希望发生什么事?看起来您需要一种密集的数据存储方法,但很难说出您真正想
你为什么不满意?泡菜怎么了?在使用Python的时候,你为什么会关注一些使用C++的深奥方法?你希望发生什么事?看起来您需要一种密集的数据存储方法,但很难说出您真正想要概括什么。我必须实现。希望这能说明一切。我必须满足line协议,它是二进制的,但不符合pickle。我对它不满意,因为它不够通用:)嗯。谢谢你的提示,但是V1没有正确序列化。已采用TLS RFC中的“”符号。需要用一个表示结构当前长度的元素对每个可变长度字节数组进行排序。在案例V1中,预期结果必须与我的示例中的结果类似。我看不出我的V1结果与您的结果有什么不同(除了我在“hello”中使用了小写h)。结果中包含了当前长度:“p”格式在Struct中就是这样做的。啊,好的。我不知道“p”。谢谢
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;
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
>>> 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
>>>