gpt4 book ai didi

rocksdb - 在 RocksDB 中存储任意字节

转载 作者:行者123 更新时间:2023-12-02 04:58:05 26 4
gpt4 key购买 nike

RocksDB声称可以存储任意数据,但API仅支持std::string类型。我要存储std::vector<T>值,如果我想这样做,那么我必须将其转换为 std::string

是否有一种不太脆弱的方法来存储任意类型?

最佳答案

我倾向于使用以下方法将结构/类打包/解包到 std::string,并使用模板自动调整其大小。

template <typename T>
std::string Pack(const T* data)
{
std::string d(sizeof(T), L'\0');
memcpy(&d[0], data, d.size());
return d;
}

template <typename T>
std::unique_ptr<T> Unpack(const std::string& data)
{
if (data.size() != sizeof(T))
return nullptr;

auto d = std::make_unique<T>();
memcpy(d.get(), data.data(), data.size());
return d;
}

因此以下客户端代码可以将结构打包和解包到数据库中:

    // Test structure
BOB b = {};
b.a = 12;
b.b = 144;
b.c[0] = 's';
b.c[1] = '\0';

// Write to the db
status = pDb->Put(rocksdb::WriteOptions(), key, Pack(&b));

// Read from db with same key
std::string result;
status = pDb->Get(rocksdb::ReadOptions(), key, &result);
std::unique_ptr<BOB> pBob = Unpack<BOB>(result);

if (b.a == pBob->a && b.b == pBob->b && b.c[0] == pBob->c[0])
{
printf("Structure matches!\n");
}
else
{
printf("Structure doesn't match!\n");
}

关于rocksdb - 在 RocksDB 中存储任意字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31565590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com