- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在考虑使用 flatbuffers 的序列化 struct
作为键值存储中的键。这是我想在 rocksdb 中用作键的 struct
示例。
struct Foo {
foo_id: int64;
foo_type: int32;
}
我阅读了文档并认为 struct
的布局是确定性的。这是否意味着它适合用作 key ?如果是,我如何序列化一个 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 等价性检查,那么在机器上这样做是否安全?或者还需要其他检查吗?
在执行上述操作时,是否还有我应该注意的任何其他注意事项?
提前致谢!
最佳答案
你实际上不需要通过 std::array
,Foo
结构已经是一 block 内存,可以按照你的意愿安全地复制或转换.它不需要序列化函数。
正如您所说,该内存包含小端数据,因此 FLATBUFFERS_LITTLEENDIAN 必须通过。实际上,即使在大端机器上,您也可以复制所有您想要的结构,只要您使用访问器读取字段(在大端上访问时进行字节交换)。唯一不能在大端上工作的是将结构强制转换为 int64_t *
以在不使用访问器方法的情况下读取第一个字段。
对某些转换操作的另一个警告是严格的别名,如果你打开了某些转换可能是未定义的行为。
另请注意,在此示例中,由于对齐原因,Foo
在所有平台上的大小均为 16 字节。
关于flatbuffers - 使用 flatbuffers 结构作为键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57560223/
假设我有以下 Flatbuffers 架构文件: union WeaponProperties { sword: PSword, axe: PAxe, mace:
我正在考虑使用 flatbuffers 的序列化 struct 作为键值存储中的键。这是我想在 rocksdb 中用作键的 struct 示例。 struct Foo { foo_id: int6
我们有以下场景: 我们正在仅允许静态内存分配 的环境中构建 FlatBuffers 应用程序。 我们传入的 FlatBuffers 包含软件更新图像,这些图像比我们在处理单元上的整个可用 RAM 还要
FlatBuffer 是否允许将二进制 fbs 文件与 JSON 相互转换(当然模式是已知的)? 我的想法是在 FlatBuffer 中定义管道和过滤器架构的结构模式。 FlatBuffer 文件也将
有没有办法将 JSON 模式转换为 Flatbuffer 模式? 这里的用例是用户可以创建 JSON 模式,但我正在寻找一种将 JSON 模式转换为 Flatbuffer 的方法。 示例:输入 {
我是 flatbuffer 的新手,我想知道是否可以完全(不是 const*)访问 flatbuffers::Vector 中的数据。看看下面的例子,我想窃取 img2::mem::data 的所有权
我引用了一些 examples我正在用 server 为我的系统建模和 client例子,我觉得我很亲近。 StarBuffer.fbs: 表 StarBuffer { 半径:双; 质量:双; 体积:
为后代发布我的作品。在用 C++ 完成我的最后一个示例后意识到我实际上需要一直用 C 来完成它(太棒了,对吧?)。作为一名 Java 程序员,这两次迭代都花费了我相当多的精力,我认为那里的许多示例代码
我有一个 3 层嵌套的 Java POJO,在模式文件中看起来像这样: struct FPathSegment { originIata:ushort; destinationIata
我正在检查 Flatbuffers 以实现通信协议(protocol)。当收到一条消息时,在我的例子中它可能包含许多不同的表。如果我理解正确,在 Flatbuffers 中实现此目的的方法是使用一个“
如果两个对象的模式中的表从相似的数据类型开始,是否有任何方法可以使用 flatbuffer 验证器验证其中具有 flatbuffer 结构的 bytearray? 示例模式: table AddTas
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我的 C++ 应用程序的当前工作如下: 1.它涉及启动另一个进程并使用windows共享内存在两个进程之间进行通信。 2.数据在一个进程中序列化,在另一个进程中反序列化。但是,数据类型也可能根据用户输
我正在编写一个使用 Google FlatBuffers 的 NodeJs 应用程序。 我在我的 macbook pro 上安装了 flatc 并编译了以下架构: 命名空间 MyAlcoholist;
我最近一直在研究 FlatBuffers 库。我正在寻找评估它以用于我的项目。看着flatbuffers.h ,我想知道是否违反了strict-aliasing rule如果它确实考虑了严格的别名,有
我正在尝试使用 FlatBuffers 来存储 OpenStreetMap 数据。所以,这将是 50GB。 由于通常所有内容都保存在内存中,怎么可能(如果有的话)按顺序将数据写入文件? 我觉得这不是
我对 C++ 和 Google 中的文件流有基本的了解 FlatBuffers . Schema文件很简单,同样是创建缓冲区和读取从缓冲区指针。我不明白的是如何将多个缓冲区保存到一个二进制文件中,然后
我有一个使用谷歌 FlatBuffers 的 nodejs 应用程序。 饮料模式的 fbs 文件: namespace MyAlcoholist; table Drink { drink_type_n
问题 在尝试访问缓冲区的一部分时,flatbuffers 生成的服务器文件反复出现崩溃(紧急情况:运行时错误: slice 边界超出范围)(使用 flatbuffers 创建),其中包含从一个客户端流
我正在使用 node.js 制作在线游戏,并尝试在游戏服务器上保存游戏重播。我正在使用 FlatBuffers 来序列化客户端-服务器通信的数据,并且我认为将游戏的状态逐帧保存在文件中会很酷。 我在
我是一名优秀的程序员,十分优秀!