De/serialize 带地图的对象?
De/serialize object with map?
给定结构示例:
struct SomeName
{
SomeName()
{
}
~SomeName()
{
}
unsigned int Id;
std::string Name;
std::map<unsigned int, unsigned int> Todo;
}
如何将 std::vector 序列化为二进制文件?
我试过:
bool Save(std::string filename, std::vector<SomeName> &items)
{
std::ofstream fileWrite;
fileWrite.open(filename.c_str(), std::ios::out | std::ios::binary);
if (!fileWrite)
{
std::cout << "Failed to open file for writting...\n";
return false;
}
fileWrite.write(reinterpret_cast<const char*>(&items[0]), items.size()*sizeof(SomeName));
fileWrite.close();
return true;
}
它可以生成 dat 文件,但是当读回它时总是失败,因为它里面有 std::map。
我试图理解崩溃消息,这是一个访问冲突,它让我相信它不理解如何初始化地图以在读回文件时填充它?或者类似的东西我没看懂。
Access violation reading location 0xfeeeff03.
指向 // <<< THIS LINE
:
_Nodeptr _Copy(_Nodeptr _Rootnode, _Nodeptr _Wherenode)
{ // copy entire subtree, recursively
_Nodeptr _Newroot = _Myhead; // point at nil node
if (!_Isnil(_Rootnode)) // <<< THIS LINE
{ // copy a node, then any subtrees
_Nodeptr _Pnode = _Buynode(_Myhead, _Wherenode, _Myhead,
SerializationCpp.exe!std::_Tree,std::allocator >,0> >::_Copy(std::_Tree_nod,std::allocator >,0> >::_Node * _Rootnode, std::_Tree_nod,std::allocator >,0> >::_Node * _Wherenode) Line 1078 + 0xc bytes C++
这是我复读的方式:
bool Load(std::string filename, std::vector<SomeName> &items)
{
items.clear();
std::ifstream file;
file.open(filename.c_str(), std::ios::in | std::ios::binary);
if (!file)
{
std::cout << "Failed to open file for reading...\n";
return false;
}
SomeName temp;
while (file.read(reinterpret_cast<char*>(&temp), sizeof temp))
{
items.push_back(temp);
}
file.close();
return true;
}
在简历中,我如何serialize/deserialize构造from/to一个二进制文件?
不能仅通过将其解释为字符数组来序列化此结构,因为它的一部分引用动态内存。使用一些序列化库(例如 boost 序列化或 google protobuf)。
或者,您可以手动实现序列化例程,但这是一项非常繁琐且容易出错的工作:
- 将
ID
写入文件
- 将
Name.length()
写入文件
- 将
Name.data()
写入文件
- 将
Todo.length()
写入文件
- 为
Todo
的每个成员写入其键和值
给定结构示例:
struct SomeName
{
SomeName()
{
}
~SomeName()
{
}
unsigned int Id;
std::string Name;
std::map<unsigned int, unsigned int> Todo;
}
如何将 std::vector 序列化为二进制文件?
我试过:
bool Save(std::string filename, std::vector<SomeName> &items)
{
std::ofstream fileWrite;
fileWrite.open(filename.c_str(), std::ios::out | std::ios::binary);
if (!fileWrite)
{
std::cout << "Failed to open file for writting...\n";
return false;
}
fileWrite.write(reinterpret_cast<const char*>(&items[0]), items.size()*sizeof(SomeName));
fileWrite.close();
return true;
}
它可以生成 dat 文件,但是当读回它时总是失败,因为它里面有 std::map。
我试图理解崩溃消息,这是一个访问冲突,它让我相信它不理解如何初始化地图以在读回文件时填充它?或者类似的东西我没看懂。
Access violation reading location 0xfeeeff03.
指向 // <<< THIS LINE
:
_Nodeptr _Copy(_Nodeptr _Rootnode, _Nodeptr _Wherenode)
{ // copy entire subtree, recursively
_Nodeptr _Newroot = _Myhead; // point at nil node
if (!_Isnil(_Rootnode)) // <<< THIS LINE
{ // copy a node, then any subtrees
_Nodeptr _Pnode = _Buynode(_Myhead, _Wherenode, _Myhead,
SerializationCpp.exe!std::_Tree,std::allocator >,0> >::_Copy(std::_Tree_nod,std::allocator >,0> >::_Node * _Rootnode, std::_Tree_nod,std::allocator >,0> >::_Node * _Wherenode) Line 1078 + 0xc bytes C++
这是我复读的方式:
bool Load(std::string filename, std::vector<SomeName> &items)
{
items.clear();
std::ifstream file;
file.open(filename.c_str(), std::ios::in | std::ios::binary);
if (!file)
{
std::cout << "Failed to open file for reading...\n";
return false;
}
SomeName temp;
while (file.read(reinterpret_cast<char*>(&temp), sizeof temp))
{
items.push_back(temp);
}
file.close();
return true;
}
在简历中,我如何serialize/deserialize构造from/to一个二进制文件?
不能仅通过将其解释为字符数组来序列化此结构,因为它的一部分引用动态内存。使用一些序列化库(例如 boost 序列化或 google protobuf)。
或者,您可以手动实现序列化例程,但这是一项非常繁琐且容易出错的工作:
- 将
ID
写入文件 - 将
Name.length()
写入文件 - 将
Name.data()
写入文件 - 将
Todo.length()
写入文件 - 为
Todo
的每个成员写入其键和值