多叉树序列化

多叉树序列化

以文件系统为例。

核心思路

使用先序遍历,进一层目录加一个[,离开就加]

[ hello [ J []  c ]  yes []  a ] 

代码实现

// data struct
struct node
{
enum file_type {
file,
folder
};
std::string name;
file_type type;
std::list<node> children;
};

// function
void fs::SaveFiles()
{
std::ofstream ofs("file.config");
SaveFileHelper(ofs, root);
}

void fs::SaveFileHelper(std::ofstream& ofs, node& n)
{
ofs << ' ' << n.name << ' ';
if (n.type == node::folder)
{
ofs << '[';
for (auto& c : n.children)
{
SaveFileHelper(ofs, c);
}
ofs << "] ";
}
}

// reserialize
void fs::LoadFiles()
{
std::ifstream ifs("file.config");
std::string start;
ifs >> start;
LoadFileHelper(ifs, root);
}

void fs::LoadFileHelper(std::ifstream& ifs, node& n)
{
std::string token;
while (ifs >> token)
{
if (token.empty())
continue;
if (token[0] == '[')
{
n.children.back().type = node::file_type::folder;
if (token == "[]")
{
continue;
}
else
{
LoadFileHelper(ifs, n.children.back());
}
}
else if (token[0] == ']')
{
return;
}
else
{
n.children.push_back(node{ .name = token, .type = node::file_type::file });
}
}
}