我是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 元素映射 in output_map
,但它只包含垃圾值 - 我的程序崩溃output_map.at()
了
{"▒▒▒▒▒▒"=>"▒▒▒▒▒▒▒▒", "▒▒▒▒▒▒"=>"▒▒▒▒▒▒▒▒"}
terminate called after throwing an instance of 'std::out_of_range'
what(): map::at
Aborted
我一直无法找到这个特定用例的任何示例,并且努力找出问题所在 - 这是序列化端的问题还是(似乎更有可能)反序列化端的问题?
编辑:感谢@SinanÜnür 指出我的错误,我现在已经在问题中更新了。这不会改变散列填充垃圾值的事实,因此无论搜索的键如何,都会引发相同的异常。