Я новичок в messagepack, и я пытаюсь взять хэш в perl, сериализую его, используя messagepack, записываю его в файл, передаю его в код C++, где файл читается и десериализуется в карту.MessagePack Perl to C++ deserialisation
Мой Perl-код для создания файла есть (примечание - я добавил дополнительную часть, чтобы проверить, я мог прочитать файл обратно и десериализации правильно в Perl, хотя я на самом деле не нужно делать):
#! perl
use strict;
use warnings;
use Data::MessagePack;
my %hTestHash = ('AAAAAA' => '20020101',
'BBBBBB' => '20030907');
my $packed = Data::MessagePack->pack(\%hTestHash);
open my $fh, '>', 'splodge.bin' or die "Failed to open slodge.bin for write: $!";
print $fh $packed;
close $fh;
open my $fh2, '<', 'splodge.bin' or die "Failed to open slodge.bin for read: $!";
local $/;
my $file = <$fh2>;
my $hrTest = Data::MessagePack->unpack($file);
Мой с ++ код десериализации затем:
#include "msgpack.hpp"
#include <string>
#include <iostream>
#include <sstream>
#include <fstream>
int main(void)
{
// Deserialize the serialized data.
std::ifstream ifs("splodge.bin", std::ifstream::in);
std::stringstream buffer;
buffer << ifs.rdbuf();
msgpack::unpacked upd;
msgpack::unpack(&upd, buffer.str().data(), buffer.str().size());
msgpack::object obj = upd.get();
std::map<std::string, std::string> output_map;
msgpack::convert(output_map, obj);
string date = output_map.at("AAAAAA");
return 0;
}
Это создает карту 2 элемента в output_map
, но он содержит только значения для мусора - моя программа вылетает на output_map.at()
с
{"▒▒▒▒▒▒"=>"▒▒▒▒▒▒▒▒", "▒▒▒▒▒▒"=>"▒▒▒▒▒▒▒▒"}
terminate called after throwing an instance of 'std::out_of_range'
what(): map::at
Aborted
Мне не удалось найти примеры этого конкретного случая использования и изо всех сил пытаться понять, что случилось - это проблема в конце сериализации или (кажется, скорее) в конце десериализации?
EDIT: Спасибо @ SinanÜnür за указание моей ошибки, которую я сейчас обновил в вопросе. Это не меняет того факта, что хеш заполняется значениями мусора, поэтому одно и то же исключение выбрасывается независимо от того, какой поиск выполняется.
@ SinanÜnür спасибо , см. мое редактирование выше – rbennett485
@ SinanÜnür, так что этот же код работает правильно для вас и создает карту в C++? –
rbennett485
''> '' и '' <''должны быть' '>: raw'' и' '<: raw'', особенно если вы находитесь на машине под Windows. Аналогично, программа C++ должна установить поток в двоичный. – ikegami