我正在研究将高度自定义且高效的二进制格式迁移到可用的二进制格式之一。数据存储在其他地方的一些低功率移动设备上,因此性能是重要的要求。 当前格式的优点是所有字符串都存储在池中。这意味着我们不会在文件中重复相同的字符串数百次,我们在反序列化期间只读取一次,并且所有对象都通过其索引引用它。这也意味着我们只在内存中保留一个副本。所以有很多优点:) 我无法为capnproto或flatbuffers找到支持这种方法的方法。或者我是否需要在顶部构建图层,并且在生成的对象中明确使用整数索引到字符串?
谢谢!
答案 0 :(得分:1)
FlatBuffers支持字符串池。只需序列化一次字符串,然后在其他对象中多次引用该字符串。该字符串只会在内存中出现一次。
最简单的例子,架构:
table MyObject { name: string; id: string; }
code(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);
答案 1 :(得分:1)
您可以像以下一样手动执行此操作:
struct MyMessage {
stringTable @0 :List(Text);
# Now encode string fields as integer indexes into the string table.
someString @1 :UInt32;
otherString @2 :UInt32;
}
理论上,Proto理论上可以允许多个指针指向同一个对象,但是出于安全原因目前禁止这样做:对于那些通过发送消息而不期望它的DoS服务器来说太容易了。是循环的或包含大量重叠参考。 See the section on amplification attacks in the docs.