【发布时间】:2019-08-20 00:57:44
【问题描述】:
我正在考虑使用 flatbuffers 的序列化 struct 作为键值存储中的键。这是我想在 RocksDB 中用作键的 structs 示例。
struct Foo {
foo_id: int64;
foo_type: int32;
}
我阅读了文档并认为struct 的布局是确定性的。这是否意味着它适合用作钥匙?如果是,我如何序列化 struct 并将其反序列化。 Table 似乎有用于序列化/反序列化的 API,但 struct 没有(?)。
我尝试序列化 struct 这样做如下:
constexpr int key_size = sizeof(Foo);
using FooKey = std::array<char, key_size>;
FooKey get_foo_key(const Foo& foo_object) {
FooKey key;
std::memcpy(&key, &foo_object, key_size);
return key;
}
const Foo* get_foo(const FooKey& key) {
return reinterpret_cast<const Foo*>(&key);
}
我做了一些健全性检查,上面的内容似乎在我的 Ubuntu 18 docker 映像中工作,并且速度非常快。所以我的问题如下:
如果机器通过了 FLATBUFFERS_LITTLEENDIAN 和 uint8/char 等效性检查,那么在机器上执行此操作是否安全?还是需要进行其他检查?
在执行上述操作时,我还应该注意哪些其他注意事项?
提前致谢!
【问题讨论】:
标签: flatbuffers