展平 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++?的可能重复 为什么要发一些没用的typedef
s?
如果您没有<sstream>
标头,则说明您的安装不完整,您需要重新安装编译器和标准库以使其完整。如果您的意思是一些带有.h
后缀的头文件,那么您的编译器和库已经过时了(因为自 20 年前 C++ 标准化以来,没有标准库头文件具有该后缀)。
代码需要自己写。
良好的序列化,即使对于像你这样的单一结构,也不是微不足道的。恰恰相反。不要自己实现它,除非你想花费无数天和小时来修复它。改为获取第三方库,只需花费几个小时即可使其正常工作。
【参考方案1】:
C++ 中没有这样的标头,.h 名称已弃用且不再使用。你的意思是<sstream>
还是<iostream>
?如果您不使用 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++ 结构 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章