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 里完成。
|