【发布时间】:2013-01-11 23:41:07
【问题描述】:
我正在编写一个用于反序列化数据的库。我有这样的结构定义:
#ifndef SEARCHRESULTS_H
#define SEARCHRESULTS_H
typedef struct {
char *url;
} SearchResult;
typedef struct {
int count;
SearchResult *searchResults;
} SearchResults;
#endif
由于 C 缺乏反射,所有函数都必须手动编写,但我相信应该有一个很好的方法来解析标题,找到 struct 名称和字段,并生成函数(伪 C):
#include "SearchResults.h"
#include "pdata_serialization.h"
void SearchResult_parse(pdata *data, SearchResult *obj) {
obj->url = strdup(data->values["url"]);
}
void SearchResult_free(SearchResult *obj) {
free(obj->url);
free(obj);
}
void SearchResults_parse(pdata *data, SearchResults *obj) {
obj->count = data->values["count"];
obj->searchResults = malloc(sizeof(SearchResult) * obj->count);
for (int i = 0; i < obj->count; i++)
SearchResult_parse(data->values["searchResults"][i], &obj->searchResults[i]);
}
void SearchResults_free(SearchResults *obj) {
for (int i = 0; i < obj->count; i++)
SearchResult_free(&obj->searchResults[i]);
free(obj);
}
我不是在寻找一个完整的解决方案,而是一个理智的、最小的想法和一个小例子。
【问题讨论】:
-
X macros 可能会来这里救援。
-
从历史上看,此类问题已通过外部工具解决,这些工具采用不同的输入格式并生成用于序列化和反序列化的结构和函数。您可能可以通过创造性地滥用预处理器来解决它,但这很快就会导致疯狂。
-
这里的 pdata 是什么?对我来说,您似乎想要一个关联数组(映射)而不是结构?如果“值”字段“计数”不存在该怎么办?
-
@OliCharlesworth,谢谢!阅读文章并尝试使用它们。
-
@Art,我对相对较小的外部工具持开放态度。事实上,我已经花了几个小时阅读有关
awk和sed的内容,但我没有写出任何有用的东西。
标签: c parsing code-generation deserialization