如何将自定义对象序列化/编码为字节/字节数组?

Cur*_*ous 4 c++ python go python-3.x

我有以下 python 类:

class Header:
  def __init__(self, id, len):
    self.id = id
    self.len = len

h = Header(1, 10)
Run Code Online (Sandbox Code Playgroud)

如何将此类的实例序列化/编码hbytesbytearray,例如可以写入socket

为了提供更多的视角,我需要将此对象写入一个 unix 域套接字,其中 C++ 程序正在侦听接收上述对象(它定义了与上面struct完全相同的内容,具有相同数量/类型的字段)。编码pickle.dump(...)无效。

结构C++是:

typedef struct Header {
  uint32_t id;
  uint32_t len;
}
Run Code Online (Sandbox Code Playgroud)

事实上,我可以C++从 与该程序进行交互Go,如下所示。

import (
  "bytes"
  "encoding/binary"
)

type Header struct {
  ID uint2
  Len uint32
}

// output of this function is written to the socket opened by C++ and it works!!
func GetHeaderBuf() *bytes.Buffer, error{
  hdrBuf := new(bytes.Buffer)
  hdr := Header{1, 10}
  if err := binary.Write(hdrBuf, binary.LittleEndian, hdr); err != nil {
    return nil, err
  }
  return hdrBuf, nil
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找的Go是上面代码行的 python 等效项binary.Write(...)

Ser*_*sta 5

这称为序列化

在Python中,您可以使用pickle自动执行(反)序列化的标准库模块,或手动序列化。在后一种情况下,您可以决定要编码的各个属性以及对它们进行编码的方式。然后struct模块进行实际的字节转换。

pickle方式:

data = pickle.dumps(h)
h2 = pickle.loads(data)
Run Code Online (Sandbox Code Playgroud)

手动方式:

假设我们需要 2 个字节来存储 id(小于 65636),需要 4 个字节来存储 len。我们可以做

data = struct.pack('>hi', h.ID, h.Len)
h2 = Header(*struct.unpack('>hi', data))
Run Code Online (Sandbox Code Playgroud)

Pickling 使用内部格式,并且只能在 Python 应用程序之间使用。另一方面,struct特别适合异构应用程序。这里>说整数值应该使用所谓的网络顺序(大)字节序。这简化了不同架构之间交换值的过程。

如果另一部分使用C语言,struct毫无疑问是可行的方法。