序列化来自同一代码库的std::函数

Serializing a std::function from same codebase

本文关键字:std 函数 代码 序列化      更新时间:2023-10-16

我一直在使用std::函数使我的类更泛型,而不是创建虚成员,这将需要声明一个我只在一个地方使用的全新类,但是当需要序列化类时,我被难住了。我知道序列化随机c++代码的想法是行不通的,但这不是我需要做的。我知道这些函数已经存在于同一个二进制文件的其他地方,所以我觉得应该有一种方法来做到这一点。我也不反对用一些"黑客"的方式来做这件事,尽管最好它能与gcc和MSVC一起工作

如果您将id或"句柄"映射到可以序列化的函数集,并且以确定性的编译时方式执行此操作,则可以将句柄序列化为整数类型。在反序列化/加载时,您可以使用此确定性映射将句柄转换为相关的函数指针类型,并从中构造std::functions。

这与在类中序列化/反序列化指针没有太大区别。这种反序列化风格通常包括两个步骤:初始化POD类型,然后在第二次传递中修复指针。

我们可以用它的参数序列化std::函数,然后将它们存档到文件中,或者存档到网络中,这样我们就可以在重新启动机器后调用该函数(带指定的参数),或者更常见的是,在另一台机器上调用rpc.

下面是一个例子:

测试代码:https://github.com/galaxyeye/atlas/blob/master/libs/serialization/test/function.cpp实现:https://github.com/galaxyeye/atlas/blob/master/atlas/serialization/function.h

关于c++中易于使用的RPC框架,它使程序员能够像使用本机函数一样使用远程函数,请参阅我的github上的project pioneer。

我将在下星期一之前完成它。

例如,如果你想在集群中的所有机器上杀死一个进程,在你的管理器程序中,只需写:

multicast_client客户;客户端。Call ("pkill", pkill, "a_bad_process");

我们假设服务器端程序实现了这样一个函数:Void pkill(const std::string&process_name);

希望有所帮助:)