使用原始字节向量作为提升序列化的存档的任何方法
Any way to use a vector of raw bytes as an archive for boost serialization?
我编写了一些代码,该代码通过串行链接接收消息,目前,消息数据最终以std :: vector出现。我想处理的是使用boost ::序列化(可能(机制将消息分开纳入班级成员。我一直在寻找如何做到这一点,我发现了许多似乎是拼图的部分,但是我有点困惑。
有很多例子让我走得太远,有些跑步,但不起作用,所以我会很感激的帮助(部分是因为我经历了很多东西,我的大脑感觉有些炸(。
要点是我在datain.hpp中有一个类,例如:
#include <cstdint>
#include <iostream>
#include <boost/serialization/access.hpp>
class DataIn
{
public:
DataIn() : m_a(4), m_b(5), m_c(6), m_d(7) {};
virtual ~DataIn() {};
void PrintDetails()
{
std::cout << "m_a " << static_cast<unsigned int>(m_a) << std::endl;
std::cout << "m_b " << static_cast<unsigned int>(m_b) << std::endl;
std::cout << "m_c " << static_cast<unsigned int>(m_c) << std::endl;
std::cout << "m_d " << static_cast<unsigned int>(m_d) << std::endl;
}
private:
uint8_t m_a;
uint8_t m_b;
uint8_t m_c;
uint8_t m_d;
friend class boost::serialization::access;
template <class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & m_a;
ar & m_b;
ar & m_c;
ar & m_d;
}
};
在我的测试驱动程序程序中,我有:
#include "DataIn.hpp"
#include <boost/archive/binary_iarchive.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>
#include <vector>
#include <cstdint>
#include <iostream>
using namespace std;
void doArchiveStuff()
{
std::vector<uint8_t> data{ 8, 9, 10, 11 };
boost::iostreams::array_source source{reinterpret_cast<char *>(data.data()), data.size()};
boost::iostreams::stream<boost::iostreams::array_source> is{source};
boost::archive::binary_iarchive ia{is, boost::archive::archive_flags::no_header};
DataIn dataIn;
dataIn.PrintDetails();
ia >> dataIn;
dataIn.PrintDetails();
}
int main()
{
std::cout << "Starting..." << std::endl;
doArchiveStuff();
return 0;
}
这会编译和链接,但是,当我运行时,我得到:
Starting...
m_a 4
m_b 5
m_c 6
m_d 7
terminate called after throwing an instance of 'boost::archive::archive_exception'
what(): input stream error
我可能只是在误解这是如何工作的,但是我总是可能只是错过了一步,所以我想我在这里问。
如果有人可以提出一个建议,我非常感谢它。
boost存档不仅仅是结构的字节表示。即使您关闭了标头,也可以使用元数据(例如键入信息(。
如果您序列结构并检查结果,则应该看到它不是(a(您的数组所包含的内容,并且(b(超过四个字节。
因此,您的输入不是有效的增强二进制档案。在这种情况下,它似乎太小了,触发了流下的流。
您应该只尝试使用相同机制序列化的事物。
相关文章:
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 对于不同的语言,是否有任何稳定的序列化方法?
- 在对象序列化期间添加额外参数是否有更好的方法?
- 使用原始字节向量作为提升序列化的存档的任何方法
- 序列化没有"save"方法的大型结构
- 我的数据结构的最佳序列化方法
- 是否有一种方法可以使用Boost Serialization序列化迭代器
- 类序列化方法
- "resurrect"(序列化/和反序列化)标准的最快方法::map
- 用C++序列化二进制数据的正确方法
- 在Objective-C中,使用C#Protobuf-Net生成的“序列化Protobuf”的最佳方法是什么?
- 在C++中快速制作一些序列化原型的肮脏方法?
- 如何将序列化方法添加到作为Windows数据结构的类成员中,以便在C++中与boost序列化一起使用
- 在没有序列化库的情况下,在 c++ 中从结构体读取和写入文件的最简单方法是什么?
- 在Qt中序列化对象图有哪些方法
- 在 Boost::Serialise 中序列化类的非侵入式方法是否使类可序列化
- C/C++:序列化方法应该是类成员吗
- c++中序列化消息的方法
- Boost::serialization——是否有一种可移植的方法来对std::wstring进行二进制序列化?
- 我们是否可以在不同的类中分离主序列化方法,以便使用c++的boost库使其更容易和不那么复杂?