使用原始字节向量作为提升序列化的存档的任何方法

Any way to use a vector of raw bytes as an archive for boost serialization?

本文关键字:序列化 方法 任何 升序 原始 字节 向量      更新时间:2023-10-16

我编写了一些代码,该代码通过串行链接接收消息,目前,消息数据最终以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(超过四个字节。

因此,您的输入不是有效的增强二进制档案。在这种情况下,它似乎太小了,触发了流下的流。

您应该只尝试使用相同机制序列化的事物。