나는 messagepack을 처음 사용하기 때문에 perl에서 해시를 가져오고, messagepack을 사용하여 직렬화하고, 파일에 쓰고, 파일을 읽고 역 직렬화하는 C++ 코드로 전달하려고합니다. 지도로. MessagePack Perl to C++ deserialisation
파일을 생성하는 내 펄 코드
은 (주 - 내가 다시 파일을 읽고 펄에 올바르게 역 직렬화 할 수 확인하기 위해 여분의 부분을 추가, 난 정말이 작업을 수행 할 필요가 없습니다 있지만)입니다 : 이#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;
}
이 output_map
에서이 요소 맵을 생성하지만, 그것은 단지 쓰레기 값을 포함 - 내 프로그램은
output_map.at()
에 밖으로 충돌 : 역 직렬화하는
#! 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);
내 C++ 코드는 다음입니다
이 특정 사례의 사례를 찾을 수 없었으며 무엇이 잘못되었는지 알기가 어려웠습니다. 직렬화가 끝날 때 문제가 발생하거나 직렬화가 끝날 때 문제가 될 가능성이 있습니까?
편집 : @ SinanÜnür이 내 실수를 지적 해 주신 데 대해 감사드립니다. 해시가 가비지 값으로 채워진다는 사실은 변경되지 않으므로 검색중인 키에 관계없이 동일한 예외가 throw됩니다.
소요
– rbennett485
@ SinanÜnür 위의 편집을 참조하십시오. 동일한 코드가 올바르게 작동하고 C++에서 맵을 생성합니까? –
rbennett485
''> ''''<'''은 특히''> : raw''와''<: raw''이어야합니다. 비슷하게, C++ 프로그램은 스트림을 바이너리로 설정해야한다. – ikegami