我有一个类(PackRequest),其中包含一些容器(EventPack)。根据用途,此容器可以由类对象拥有,也可以从某个外部源提供。
特别是,整个对象被转移到另一个进程,因此必须序列化。因此,在发送过程中,它是从某个外部源提供的,然后仅序列化和传输。在接收过程中,我们必须从序列化数据中恢复它 - 因此,我们必须创建和拥有它。
我用非常简单的解决方案解决了它,但我并不完全喜欢它:
class PackRequest : public Request {
private:
unique_ptr<EventPack> owned_pack_;
EventPack *pack_;
public:
PackRequest(EventPack *pack=nullptr)
: pack_(pack) {}
void serialize() override;
void unserialize() override;
};
然后序列化/反序列化函数如下所示:
void PackRequest::serialize() {
auto size = pack_->serialized_size();
data_msg_ = make_unique<zmq::message_t>(size);
pack_->serialize_bin(data_msg->cdata(), size);
}
void PackRequest::unserialize() {
owned_pack_ = make_unique<EventPack>();
pack_ = owned_pack_->get();
pack_->unserialize_bin(data_msg_->cdata(), data_msg_->size());
}
然后在发送端owned_pack_是nullptr,pack_是在构造函数中提供的 - 所以我们不拥有对象,我们只是将其序列化为data_msg_并发送。在接收端,我们在data_msg_中获取相同的数据 - 因此我们创建归我们所有的新对象(保存在owned_pack_中),然后将其从数据中反序列化。
现在,它可以工作并且很短 - 但我不确定这是否是最好的方法 - 特别是,它使用了我不喜欢的非智能指针。那么,您是否对更多符合现代C++规则的东西有所想法?
由于您可以保证原始指针始终有效(当它被使用时),因此不需要智能指针,并且您当前的实现很好。
另一种选择是在外部源中使用shared_ptr
,并在PackRequest
中使用单个shared_ptr
。这增加了对对象在外部源中的存储方式的依赖(必须是shared_ptr
),并且对引用计数有一些小的开销,但另一方面,你永远不需要测试哪个指针有数据。