【发布时间】:2019-05-20 04:52:08
【问题描述】:
FlatBuffers 特别避免了某些编码标准化/保证。根据文档:
(https://google.github.io/flatbuffers/flatbuffers_internals.html)
这可能意味着两种不同的实现可能会产生不同的 给定相同输入值的二进制文件,这是完全有效的。
好的,但是字符串是直接从给定的任何表示形式在磁盘上编码的,还是以其他表示形式编码的?是否使用相同的 FlatBuffers 版本和生成的代码确定性的编码操作(具有相同参数的 N 次操作产生相同的结果)?
尺寸呢?动态结构大小的减小(例如向量、字符串值被缩短)是否会相应地减小编码结构的大小?
我真的不明白字符串编码是如何工作的,我现在没有时间拆开内部代码。
我创建了一个示例定义,它具有一般的 parent->child->grandchild 结构,其中 parent 类型具有 child 类型的向量,而 grandchild 类型嵌入了一个字符串以及一个 struct。我想通过包含其中的几个来夸大不同类型的值可能会引入输出大小的任何熵。然后,我用 5 个符文字符串乘以 50 填充 grandchild 中的字符串值,并手动将乘数递减 1,并每次打印最终编码的输出大小:
$ go run main.go
String size: (250)
Output encoding size: (400)
$ go run main.go
String size: (245)
Output encoding size: (400)
$ go run main.go
String size: (240)
Output encoding size: (392)
$ go run main.go
String size: (235)
Output encoding size: (384)
为什么在我从原始字符串值中删除五个字节后,编码的输出大小没有改变?为什么我从原始字符串中每删除五个字节,它就会缩小八个字节?由于这些是字符串,因此我认为对齐不会在这里发挥作用。
我仍然有上述问题,但似乎可能是一个安全的假设(呃,保证)1)编码的大小对于相同的参数是稳定的,2)将随着其中一个或多个值大小的减小而缩小。这是真的吗?
感谢您为我节省了一些时间和错误,我现在不必自己解决这个问题(希望如此)。
作为参考,这是定义:
namespace testformat;
struct Vector {
field9:ulong;
field10:ulong;
field11:ulong;
}
table Grandchild {
field5:ulong;
string6:string;
field7:ulong;
field8:Vector;
}
table Child {
field3:ulong;
field4:ulong;
grandchild:Grandchild;
}
table Parent {
field1:ulong;
field2:ulong;
children:[Child];
}
root_type Parent;
这是我更改的重复字符串值的部分 Go 代码(在顶部):
stringValue := strings.Repeat("strin", 50)
fmt.Printf("String size: (%d)\n", len(stringValue))
stringOffset := b.CreateString(stringValue)
testformat.GrandchildStart(b)
testformat.GrandchildAddField5(b, 44)
testformat.GrandchildAddString6(b, stringOffset)
testformat.GrandchildAddField7(b, 55)
vectorOffset := testformat.CreateVector(b, 11, 22, 33)
testformat.GrandchildAddField8(b, vectorOffset)
grandchildOffset := testformat.GrandchildEnd(b)
【问题讨论】:
标签: flatbuffers