在C中序列化一个函数

时间:2016-05-19 17:50:14

标签: c function serialization struct generic-programming

我想知道是否可以用C编程语言序列化(C编写)函数。上下文如下:我有一个键值对的二叉搜索树。键是标准的以null结尾的字符串,值的类型如下:

typedef struct generic_value{

  void *val;
  void (*free_value)(void *);
  void (*write_value)(void *,FILE *);
  void *(*read_value)(FILE *);
  datatype type;
}generic_value;

本质上,节点值包含指向核心数据集(void * val)的指针,以及支持向/从文件写入/读取核心数据的函数的指针,以及知道如何释放的解除分配函数解除分配核心数据。目前,上面的结构还包含一个额外的枚举类型(数据类型)来描述核心数据的类型:

typedef enum{
  integer_t,decimal_t,string_t,complex_t,vector_t,matrix_t
}datatype;

我想知道如何序列化这些结构成员所指向的函数(例如它们的可执行代码),这样当BST写入文件时,它随后可以在不知道这些函数的情况下被导回到内存中 - - 首先读入它们的可执行代码,然后调用read_value()函数,以便将核心数据导入void * val;这样就可以避免使用"数据类型"会员。这在C中完全可能吗?

2 个答案:

答案 0 :(得分:1)

标准C没有提供将代码作为数据或数据处理为代码的机制。此外,大多数现代存储器管理单元和操作系统区分为数据指定的存储器和为可执行代码指定的存储器,并且它们不允许跳转到前者。即使它们没有,你也会遇到链接问题,除非你建议序列化的函数是完全独立的,不依赖于任何其他函数,包括标准库函数。所以不,你不能序列化函数。

如果您希望能够调用最初未链接到应用程序的函数,那么您将需要在运行时链接到共享库中。在POSIX世界中,您将主要寻找dlopen()链接到库和dlsym()以获取指向所需函数的指针。后者将函数名称作为一个参数直接指向可以使用此方法的序列化策略。

答案 1 :(得分:0)

是的,这很有可能,尽管摆脱了“泛型编程”。您将不得不深入研究可执行格式。如果您只是将代码写入文件中,它就不会起作用。您将不得不进行一些计算并使用它存储一些附加信息,这些信息将在您加载代码时用于轻微初始化。 Sooo是的,这可以在C中完成。但这不是关于语言... Google ELF和PE。