Nano Hash - криптовалюты, майнинг, программирование

Как избежать boost :: archive :: archive_exception при десериализации нескольких структур из очереди сообщений?

Я читаю очередь сообщений, используя Boost.Serialization ( v1.46). Все работает нормально, пока очередь содержит только один элемент. Но когда я читаю очередь, содержащую более одного элемента, возникает следующее исключение:

terminate called after throwing an instance of 'boost::archive::archive_exception'
what():  invalid signature

archive_exception.hpp говорит invalid signature // first line of archive does not contain expected string"

Класс, который я сериализирую и десериализую, выглядит следующим образом:

#define MAX_SIZE 1000

class IpcMsg {

public:
    IpcMsg(int logLevel = 0, std::string logMsg = "") :
            logLevel(logLevel), logMsg(logMsg) {
    }
    ;

    int logLevel;
    std::string logMsg;

private:
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version) {
        ar & logLevel;
        ar & logMsg;
    }
};

сериализация:

try
    {
        message_queue mq
            (
             open_or_create,
             "mq",
             100,
             MAX_SIZE
            );

        IpcMsg logMsg(1, "Test");

        std::stringstream oss;

        boost::archive::text_oarchive oa(oss);
        oa << logMsg;

        std::string serialized_string(oss.str());
        mq.send(serialized_string.data(), serialized_string.size(), 0);
    }
    catch(interprocess_exception &ex)
    {
        std::cerr << ex.what() << std::endl;
    }

десериализация:

...
IpcMsg logEntry;

std::stringstream iss;
std::string serialized_string;
serialized_string.resize(MAX_SIZE);

while(mq.try_receive(&serialized_string[0], MAX_SIZE, recvd_size, priority)){

    iss << serialized_string;

    boost::archive::text_iarchive ia(iss);
    ia >> logEntry;

     msgs.push_back(logEntry);

     std::cout << logEntry.logLevel << std::endl;
     std::cout << logEntry.logMsg << std::endl;
}


Ответы:


1

Этот код создает std::stringstream, состоящий из сообщения, за которым следует до MAX_SIZE нулевых символов.

serialized_string.resize(MAX_SIZE);
mq.try_receive(&serialized_string[0], MAX_SIZE, recvd_size, priority);
iss << serialized_string;

Я предполагаю, что Boost.Serialization поражает символы NULL, которые находятся после первого сообщения, и выдает ошибку.

Может, лучше попробовать что-нибудь подобное?

serialized_string.resize(MAX_SIZE);
mq.try_receive(&serialized_string[0], MAX_SIZE, recvd_size, priority);
serialized_string.resize(recvd_size);
iss << serialized_string;

(Кроме того, я лично не поклонник кода, такого как &serialized_string[0]. См. здесь, здесь. vector<char> или умный указатель на старый добрый char[] может быть лучше.)

16.07.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..