展平 C++ 结构 [关闭]

Posted

技术标签:

【中文标题】展平 C++ 结构 [关闭]【英文标题】:Flatten a C++ structure [closed] 【发布时间】:2018-08-29 01:19:15 【问题描述】:

如何在不使用任何外部库的情况下将以下 C++ 结构序列化/展平为字节数组或其他任何内容。

struct node                                                 

    string splitOn;                                         
    string label;                                           
    bool isLeaf;                                            
    vector<string> childrenValues;                          
    vector<node*> children;                                 
;

【问题讨论】:

Is it possible to serialize and deserialize a class in C++?的可能重复 为什么要发一些没用的typedefs? 如果您没有&lt;sstream&gt; 标头,则说明您的安装不完整,您需要重新安装编译器和标准库以使其完整。如果您的意思是一些带有.h 后缀的头文件,那么您的编译器和库已经过时了(因为自 20 年前 C++ 标准化以来,没有标准库头文件具有该后缀)。 代码需要自己写。 良好的序列化,即使对于像你这样的单一结构,也不是微不足道的。恰恰相反。不要自己实现它,除非你想花费无数天和小时来修复它。改为获取第三方库,只需花费几个小时即可使其正常工作。 【参考方案1】:

C++ 中没有这样的标头,.h 名称已弃用且不再使用。你的意思是&lt;sstream&gt; 还是&lt;iostream&gt;?如果您不使用 serailization 库,则必须自己编写。例如。定义序列化运算符。没有像 java 中那样由语言定义的序列化,如果要考虑版本变化,则必须设计新的或使用现有的表示格式。

【讨论】:

那么将结构的每个成员都转换为 char 数组? 如果这些成员是容器,你不能投(见我上面的评论)。非标准布局、非平凡类的内部表示依赖于实现和编译模式,尝试存储副本和重用这些表示会导致未定义的行为。您必须从大小可变的集合中提取数据(无论如何它都单独存储在堆中,而不是在类中)。【参考方案2】:

您可以使用 memcpy 将结构体node 中的信息逐位复制到字符数组frame 中,如下所示:

struct node obj;
char frame[1024];
memcpy ( frame, &obj, sizeof(struct node) );

然后您可以逐位串行发送frame 并稍后恢复结构,如下所示:

memcpy ( &obj2, frame, sizeof(struct node) );

但是,我还没有测试过这段代码。您可能需要将第一个和第二个参数转换为 void *

【讨论】:

它可以与包含向量的结构一起使用吗? 那行不通,是一个 UB。 memcpy 仅可用于可构造、可复制和可破坏的类(几乎是 POD)。您的课程不是,因为它的字段不是。从实现的角度来看,这永远不会复制存储在字段资源中的数据

以上是关于展平 C++ 结构 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何展平每个子列表是一个包含单个浮点数的列表列表[关闭]

这是指啥 C++ 数据结构? [关闭]

在 C++ 中加入结构? [关闭]

将结构从 C++ 调用到 C [关闭]

系统地缩放 C++ 函数的返回结构 [关闭]

在 C++ 构造函数中为结构数组分配存储[关闭]