将 boost::serialization::serialize'ble 结构作为二进制文件存储到硬盘上
Store a boost::serialization::serialize'ble struct as binary onto harddisk
我想把下面的例子作为一个简单的二进制文件存储在硬盘上。但在网上,我还没有找到任何简单明了的例子来做这件事,所以我在质疑:
如何修改下面的代码,将结构作为二进制存储在二进制文件中?
#include <vector>
#include <string>
#include <bitset>
#include <boost/serialization/string.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/bitset.hpp>
template<size_t N>
struct Example
{
std::string id;
std::vector<std::bitset<N>> bits;
};
template<size_t N>
Example<N> make_example()
{
Example<N> example;
example.id = "some id";
example.bits.resize(100);
}
namespace boost
{
namespace serialization
{
template<typename Archive, size_t N>
void serialize ( Archive & a
, Example<N> & e
, const unsigned int version )
{
a & e.id;
a & e.bits;
}
}
}
int main()
{
auto example = make_example<256>();
std::ofstream ofs("filename", std::ios::binary);
boost::archive::binary_oarchive oa(ofs);
oa << example; // shouldn't use << as oa writes a text archive
}
我认为问题是:
- 需要在
make_example()
中返回example
。您可能在此处收到编译器警告,但您忽略了该警告 - 需要
#include <boost/archive/binary_oarchive.hpp>
。否则,它甚至不应该编译
此外,您的注释// shouldn't use << as oa writes a text archive
不太正确,因为<<
现在为boost::archive::binary_oarchive
重载,因此它是二进制流。
因此,修改后的代码应该看起来像:
#include <vector>
#include <string>
#include <bitset>
#include <fstream>
#include <boost/serialization/string.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/bitset.hpp>
// ADD THIS!!!
#include <boost/archive/binary_oarchive.hpp>
template<size_t N>
struct Example
{
std::string id;
std::vector<std::bitset<N>> bits;
};
template<size_t N>
Example<N> make_example()
{
Example<N> example;
example.id = "some id";
example.bits.resize(100);
// ADD THIS!!!
return(example);
}
namespace boost
{
namespace serialization
{
template<typename Archive, size_t N>
void serialize ( Archive & a
, Example<N> & e
, const unsigned int version )
{
a & e.id;
a & e.bits;
}
}
}
int main()
{
auto example = make_example<256>();
std::ofstream ofs("filename", std::ios::binary);
boost::archive::binary_oarchive oa(ofs);
oa << example;
return(0);
}
这里有一个关于SO的相关示例。
更新使std::bitset
的二进制序列化更加紧凑
看看@6502的SO答案。然后您需要:
- 将
serialize
函数拆分为单独的load
和save
函数。有关示例,请参见此(在教程::将序列化拆分为保存/加载下) - 在
save
中,对e.bits
进行迭代,并使用@6502的bitset_to_bytes
函数将e.bits[i]
的EACH转换为std::vector<unsigned char>
。然后您将得到一个std::vector<std::vector<unsigned char>>
(save
函数中的局部变量)。将其序列化 - 相反,在
load
中,取消序列化以获得std::vector<std::vector<unsigned char>>
(同样是load
中的局部变量)。然后,对该集合进行迭代,并使用@6502的bitset_from_bytes<N>
函数将EACHstd::vector<unsigned char>
转换为e.bits[i]
- 移除
#include <boost/serialization/bitset.hpp>
,您不再需要它
这将使二进制存档中的每个std::bitset<N>
的存储从N
字节变为(N+7)/8
字节。
希望这能有所帮助。
相关文章:
- 无法在二进制文件中存储动态数组
- 如何创建属性存储二进制文件
- 如何从 linux 二进制文件中存储和检索数据
- 将Protobuf字节类型存储在二进制文件中
- 如何在结构中存储二进制文件数据
- (C++) 如何从要存储在结构数组中的二进制文件中读取.dat信息?
- 保存和加载类数据存储在C 中的二进制文件中
- 使用fstream从二进制文件中读取并将结果存储在向量中
- 将敏感数据存储在C 编译的二进制文件中是否安全
- 用于存储数据的结构和外部二进制文件
- 将可变大小结构的向量存储在c++中的二进制文件中
- 各种数据类型的变量如何存储在C++(本机)二进制文件中
- C++标准是否保证字符串文本完全存储在程序中 二进制文件.
- 程序从存储在自身中的变量而不是从二进制文件中读取
- 编译C++二进制文件是否存储原始源代码
- 将客户数据存储到 c++ 中的二进制文件中
- C++:将读取的二进制文件存储到缓冲区中
- 重定位表项在平面二进制文件中的存储位置
- 用c++将无符号字符存储为二进制文件
- 将 boost::serialization::serialize'ble 结构作为二进制文件存储到硬盘上