-1

我正在研究将高度定制且高效的二进制格式迁移到一种可用的二进制格式。数据存储在其他地方的一些低功率移动设备上,因此性能是重要的要求。当前格式的优点是所有字符串都存储在一个池中。这意味着我们不会在文件中重复相同的字符串数百次,我们在反序列化期间只读取一次,并且所有对象都通过其索引引用它。这也意味着我们在内存中只保留一份副本。所以有很多优点:) 我无法找到一种方法让 capnproto 或 flatbuffers 支持这一点。或者我是否需要在顶部构建层,并在生成的对象中明确使用整数索引来字符串?

谢谢!

4

2 回答 2

1

FlatBuffers 支持字符串池。只需序列化一个字符串一次,然后在其他对象中多次引用该字符串。该字符串只会在内存中出现一次。

最简单的例子,架构:

table MyObject { name: string; id: string; }

代码(C++):

FlatBufferBuilder fbb;
auto s = fbb.CreateString("MyPooledString");
// Both string fields point to the same data:
auto o = CreateMyObject(fbb, s, s);
fbb.Finish(o);
于 2016-01-24T17:52:08.867 回答
1

您始终可以手动执行此操作,例如:

struct MyMessage {
  stringTable @0 :List(Text);

  # Now encode string fields as integer indexes into the string table.
  someString @1 :UInt32;
  otherString @2 :UInt32;
}

Cap'n Proto 理论上可以允许多个指针指向同一个对象,但目前出于安全原因禁止这样做:通过发送循环或包含大量重叠的消息来拒绝不期望它的服务器太容易了参考。请参阅文档中有关放大攻击的部分。

于 2016-01-25T06:10:01.757 回答