- 主题:这个json序列化、反序列化的库看着还可以
rapidjson以(单线程)速度、小巧见长。好多年前在某个team呆时,那个team选型用过,当时说是有不少要改的问题,现在估计应该好很多了
它应该没有反序列化到struct的功能,这个是它的序列化的例子:
https://github.com/Tencent/rapidjson/blob/master/example/serialize/serialize.cpp
顶楼那个cpp-json倒是focus在序列化、反序列化上,用了个关于宏的奇技淫巧,__VA_OPT__这个c++20才有的宏。
https://www.scs.stanford.edu/~dm/blog/va-opt.html
用llvm的libtooling搞预处理的那个easy_reflection,等于是帮编译器实现反射,也是正途,
不过依赖于compile_commands.json。cmake工程输出这个容易,visual studio的sln工程要输出compile_commands.json,还得装插件,CI服务器麻烦,但可以弄个写死的compile_commands.json,需要预处理的.cpp、.h都写死进去。
【 在 allegro 的大作中提到: 】
: rapidjson可以吗?
: 我用cereal的json接口,内部好像是rapidjson
:
--
修改:z16166 FROM 123.118.191.*
FROM 123.118.191.*
厉害
是在编译时依赖调试信息,还是运行时依赖?
发布出去的elf一般会strip掉调试信息,一是为了尺寸,顺带增大一点别人逆向的难度。
【 在 pfan117 的大作中提到: 】
: 我上班的时候做过C语言结构体序列化,反序列化,依赖dwarf信息。支持结构体嵌套,多维数组,位域。
--
FROM 123.118.191.*
C++迟迟没有静态反射的恶果
【 在 z16166 的大作中提到: 】
: rapidjson以(单线程)速度、小巧见长。好多年前在某个team呆时,那个team选型用过,当时说是有不少要改的问题,现在估计应该好很多了
:
: 它应该没有反序列化到struct的功能,这个是它的序列化的例子:
: ...................
--
FROM 113.200.204.*
用 c++ 就不必考虑这些了吧。把 c/c++ 当作比汇编语言更高级一点的低级语言,多写点代码就当作用 c++ 追求性能的代价了。
【 在 milksea 的大作中提到: 】
: C++迟迟没有静态反射的恶果
--
FROM 222.76.77.*
整个就1200行代码,复杂的struct能嵌套(内层的struct需要提供serialize实现,因为宏里的成员列表是没法跨越父struct和子struct的),然后加std::wstring的也好加。
虽然需要c++20编译器,我这边的倒是都能用支持c++20的编译器,应该不是问题。
有点小瑕疵的代码clean一下应该就行了,剩下的就是使用中fix bug完善。里面那两个大的if/else感觉也可以改成用模板偏特化来实现。
小而美的感觉,不过要实际用一下
nlohmann json如果增加std::wstring成员方便的话,也是可以考虑的。
它搞的宏NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE提供了from_json/to_json的默认实现。
【 在 allegro 的大作中提到: 】
: json序列化/反序列化有N个高star的实现。
: 为什么要花时间研究一个名不见经传的小repo?
:
--
修改:z16166 FROM 123.118.191.*
FROM 123.118.191.*
C++和C定位不一样,C++追求高效抽象。
静态反射没有性能开销。
从理念上说,静态反射是很符合C++风格的,提案很早就有,用处也很大,但讨论至今没定下来,这也很c++
【 在 hgoldfish 的大作中提到: 】
: 用 c++ 就不必考虑这些了吧。把 c/c++ 当作比汇编语言更高级一点的低级语言,多写点代码就当作用 c++ 追求性能的代价了。
:
: 【 在 milksea 的大作中提到: 】
: ...................
--
FROM 113.200.204.*
静态反射也需要额外存储类型信息的吧。
C++ 现在已经有 typeid() 了。为了实现楼主说的 JSON 序列化与反序列化就必须细化到函数和属性级。那存储的类型信息就太多了。
如果 C++ 和 Java 越来越像,我们还不如直接用 Java 算了。
【 在 milksea 的大作中提到: 】
: C++和C定位不一样,C++追求高效抽象。
: 静态反射没有性能开销。
: 从理念上说,静态反射是很符合C++风格的,提案很早就有,用处也很大,但讨论至今没定下来,这也很c++
: ...................
--
FROM 222.76.77.*
【 在 z16166 的大作中提到: 】
: 厉害
: 是在编译时依赖调试信息,还是运行时依赖?
: 发布出去的elf一般会strip掉调试信息,一是为了尺寸,顺带增大一点别人逆向的难度。
: ...................
运行时,所以要保留dwarf信息... ...
--
FROM 49.5.204.*
需要动态创建的class才保存用于反射的meta信息就行了
C++的反射标准,还早着呢,最早都得C++26了
【 在 hgoldfish 的大作中提到: 】
: 静态反射也需要额外存储类型信息的吧。
: C++ 现在已经有 typeid() 了。为了实现楼主说的 JSON 序列化与反序列化就必须细化到函数和属性级。那存储的类型信息就太多了。
: 如果 C++ 和 Java 越来越像,我们还不如直接用 Java 算了。
: ...................
--
修改:z16166 FROM 123.118.191.*
FROM 123.118.191.*
想明白了。静态反射是指通过模板语法,在编译期就生成对应字段的序列化与反序列化代码。递归的模板类结合 enable_if<> 这个方向是吧。
我前面想成在动态期根据存储的类型信息来生成。
不过既然是用模板,那编译速度可想而知了。
【 在 z16166 的大作中提到: 】
: 需要动态创建的class才保存用于反射的meta信息就行了
: MFC里老早就有一套反射宏,版上搞过MFC的veteran应该都知道哈哈
: C++的反射标准,还早着呢,最早都得C++26了
: ...................
--
FROM 222.76.77.*