如何序列化包含 proto 对象的 python 对象?

Sha*_*gde 5 python pickle protocol-buffers

假设我有一个像这样的 python 类:

import pickle
import msg_pkt_pb2

class Solver(object):
  def __init__(self, proto_objs:msg_pkt_pb2.MessagePackets, _obj_fn=lambda x,y:(x - y)**2):
    self._proto_objs = proto_objs
    self.num_iterations = 0
    self.num_pass = 0
    self._obj_fn = _obj_fn
  
  def solve_or_die(self):
    try:
      ...
      _obj_fn(a, b)
    except:
      self._make_ckpt()

  def _make_ckpt(self):
    f = open('ckpt.pkl', 'wb')
    pickle.dump(self, f)
    f.close()
  
  def load_from_ckpt(self, filename):
    ...
Run Code Online (Sandbox Code Playgroud)

原型:

message MessagePkt {
   string name=1;
   int32 id=2;
   string payload=3;
}

message MessagePackets{
   int32 id=1;
   repeated MessagePacket message_pkts=2;
}
Run Code Online (Sandbox Code Playgroud)

我想序列化这个包含原型对象(部分填充)的对象,不幸的是,当我尝试序列化这个对象时,我得到一个异常:


_pickle.PicklingError: Can't pickle <class 'msg_pkt_pb2.MessagePackets'>: it's not the same object as msg_pkt_pb2.MessagePackets
Run Code Online (Sandbox Code Playgroud)

让我知道保存该对象并将其加载回来的最佳方法是什么?