2016-12-02 4 views
0

나는 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됩니다.

+0

소요

#include "msgpack.hpp" #include "map.h" #include <string> #include <iostream> #include <fstream> void unpack_map(const msgpack::object& o, Map<string,msgpack::object>& results){ ASSERT(o.type == msgpack::type::MAP); for (msgpack::object_kv *p = o.via.map.ptr, *pend = (o.via.map.ptr + o.via.map.size); p != pend; ++p) results[p->key.as<string>()] = p->val; } int main(void) { streampos size; char * memblock; ifstream file ("splodge.bin", ios::in|ios::binary|ios::ate); if (file.is_open()) { size = file.tellg(); memblock = new char [size]; file.seekg (0, ios::beg); file.read (memblock, size); file.close(); cout << "the entire file content is in memory"; } else cout << "Unable to open file"; msgpack::unpacked upd; msgpack::unpack(&upd, memblock, size); msgpack::object obj = upd.get(); if(obj.type != msgpack::type::MAP) { cout << ":(" << endl; } else { cout << ":)" << endl; } cout << "size: " << obj.via.map.size << endl; Map<string, msgpack::object> objectMap; unpack_map(obj, objectMap); msgpack::object val = objectMap["BBBBBB"]; string tmp = string(val.via.raw.ptr, val.via.raw.size); delete[] memblock; return 0; } 

rbennett485

+0

@ SinanÜnür 위의 편집을 참조하십시오. 동일한 코드가 올바르게 작동하고 C++에서 맵을 생성합니까? – rbennett485

+0

''> ''''<'''은 특히''> : raw''와''<: raw''이어야합니다. 비슷하게, C++ 프로그램은 스트림을 바이너리로 설정해야한다. – ikegami

답변

-2

마지막으로 적절한 바이너리 파일 읽기와 우리가 보유하고있는 별난 사내 데이터 유형의 조합으로 작업 할 수있게되었습니다.

(필요할 때마다 값을 역 직렬화하는 추가 단계를 필요로하는 Map<string, msgpack::object>으로 구조를 직렬화) 작용 코드 : tmp가 SinanÜnür 덕분 @ 값 20030907