
1 h4x3rotab 2016-06-18 19:34:40 +08:00 via iPhone 搜索关键词: c++ 序列化 |
2 rogerchen 2016-06-18 19:49:02 +08:00 protocol buffer |
3 skydiver 2016-06-18 19:54:44 +08:00 via iPad 用宏实现 |
4 rtyurtyu OP 我需要文本式的序列化而不能是看不懂的二进制形式的,因为有双击.ini 直接编辑配置文件的需求 如果没有直接编辑的需求那最简单的直接二进制写一个 struct 到文件就搞定了 看了看现有的库好像都不太合适的样子 还是想完全自写 |
5 sfqtsh 2016-06-18 20:12:28 +08:00 via Android #include <iostream> using namespace std; #define DefineVar(type, name, value) #type" "#name" = ";type name = value int main() { char str[] = DefineVar(int, iAbc, 8); cout << str << iAbc << endl; //"int iAbc = 8" return 0; } |
7 k9982874 2016-06-18 20:20:02 +08:00 via iPad boost property_tree 操作 ini tinyxml 操作 xml jsoncpp 操作 json 没必要自己再造轮子 |
8 Sorrow 2016-06-18 20:26:55 +08:00 via iPad 使用 boost::any 可以存放任意类型的数据,或者直接使用 c++ 17 的 std::any |
9 rtyurtyu OP |
11 matthewgao 2016-06-19 00:31:26 +08:00 @Sorrow any 好像也不解决他的问题,他是要一个类似 Java 反射的功能 |
12 matthewgao 2016-06-19 00:37:33 +08:00 可不可以这样 workaround 一下,用 unordered_map<std::string, std::any>来保存你要解析的属性,就不要把它变成真正的类属性 |
13 owt5008137 2016-06-19 00:42:07 +08:00 C++目前还不支持反射,是做不到像 Java 或者 C#那样枚举成员变量的。用宏只是一点点取巧而已,也不是特别方便,可以参考 msgpack-c 的设计,就是宏实现的。 用 protobuf 之类的可能是简单得多的方案了,特别是 protobuf 3 可以直接读写 json ,用它的反射接口写序列化和反序列化也不困难。但是还是得写 proto 文件,并且 protobuf 也是蛮臃肿的。 或者寻求简洁的话可以参考下我的这个 ini 读取库,只有两个文件。 https://github.com/owt5008137/libiniloader 用 std::string 来存数据,用模板来自动检测类型,转换数据内容 |
14 nozama 2016-06-19 02:48:45 +08:00 via iPhone 我猜最多只能用 宏、模板鸡肋地实现,或者代码生成器(比如 protobuf....好像太重量级)。 这我想起 rust 的好了,编译器扩展也可以是 library 的一部分,有不少序列化库都利用了这一点,借助编译时的信息来生成代码,可以非侵入式地实现序列化 /反序列化。 我更想说的是,用合适的工具做合适的事、合理地分离关注点,比对语言进行晦涩的 hack 要好。 |
15 rtyurtyu OP 看了 ls 各位的意见又想了很多,突然感觉追求个最精简语法.xxx=x 没有什么意义,非要用静态语言来搞动态语言的事纯粹是找虐 如果用宏来实现,变量定义那里语法仍然怪怪的,宏也复杂得让人看不懂 而且每次新加一个变量都需要改源码重新编译 不如就用 unordered_map<std::string, std::any> cSave; 好处是代码易读,而且能够动态添加 cSave["aaa"]=111; 写起来比 cSave.aaa=111 只多三个字符,就是引号有点烦... 当然现在 std::any 的支持度为 0 ,实际实现还得用一些替代方法 |
16 jukka 2016-06-19 13:07:11 +08:00 最简单的做法是继承一个 Lua 虚拟机进去,然后这些事情都在 Lua 里完成。 |