char型のバッファを持つあなたのアプローチは、ヒープメモリを割り当てない単純なクラスと理論の仕事に(あなたは、アライメントの問題を扱うことを考える)ことができます。
ではなく、穀物など、後押し::シリアライズを、いるProtobufのようないくつかのシリアル化ライブラリを使用してみてください。 Redisのは、あなたのデータは変更されません
#include <cassert>
#include <sstream>
#include <string>
#include <unordered_map>
#include <hiredis/hiredis.h>
#include <cereal/archives/binary.hpp>
#include <cereal/types/memory.hpp>
#include <cereal/types/unordered_map.hpp>
class foo {
int i;
std::string s;
std::unordered_map<std::string, int> m;
friend class cereal::access;
template <typename Archive>
void serialize(Archive& archive) {
archive(i, s, m);
}
public:
foo() {}
foo(int i, const std::string& s) : i(i), s(s) { m[s] = i; }
friend bool operator==(const foo& l, const foo& r) {
return l.i == r.i && l.s == r.s && l.m == r.m;
}
};
int main() {
std::ostringstream oss;
cereal::BinaryOutputArchive archive{oss};
foo f{10, "bar"};
archive(f);
auto redis_context = redisConnect("127.0.0.1", 6379);
const auto set_reply =
redisCommand(redis_context, "SET key %b", oss.str().c_str(), oss.str().length());
freeReplyObject(set_reply);
// later on
const auto get_reply =
static_cast<redisReply*>(redisCommand(redis_context, "GET key"));
std::string repr{get_reply->str, static_cast<size_t>(get_reply->len)};
freeReplyObject(get_reply);
std::istringstream iss{repr};
cereal::BinaryInputArchive input(iss);
foo g;
input(g);
assert(f == g);
redisFree(redis_context);
}
:ここ
はcerealとの一例です。コードに問題がある可能性があります。ところで、Redisはバイナリ文字列を保存できるので、データのエンコードとデコードにbase64を使う必要はありません。 –
は、<「我々はバッファcharにClassオブジェクトを変換して試してみました」 - どのようにシリアライズを行う(その後、「変換」)でした - 私は、これが問題になる可能性が疑われますか? –
@for_stackとItamar Habar、あなたのコメントをありがとう、今我々はcharバッファを使用して適切なオブジェクトを格納し、取得することができます。 –