私はmessagepackを初めて使用し、perlでハッシュを取得し、messagepackを使用してシリアル化し、ファイルに書き込み、それをC ++コードに渡し、ファイルを読み取ってマップに逆シリアル化しようとしています。
ファイルを生成するための私の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);
次に、逆シリアル化する私の C++ コードは次のとおりです。
#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
この特定のユースケースの例を見つけることができず、何が問題なのかを確認するのに苦労しました.これはシリアライゼーションの終わりの問題ですか、それともデシリアライゼーションの終わりの問題ですか?
編集:私の間違いを指摘してくれた@SinanÜnürに感謝します。質問で更新しました。これは、ハッシュにガベージ値が入力されているという事実を変更しないため、検索対象のキーに関係なく同じ例外がスローされます。