我遇到了一个问题,即从字节中更改了平面缓冲区。根据Flatbuffer文档(https://github.com/google/flatbuffers/blob/master/docs/source/Tutorial.md),您可以 更改固定大小的字段,例如int32。如下所示,生成的golang TestMutate具有一个 MutateServerId()函数。我的问题是,对它进行了变异后,字节似乎没有变化。
这是我的平面缓冲区表定义:
Storage storage = StorageOptions.getDefaultInstance().getService();
BlobId blobId = BlobId.of("bucket", "blob_name");
BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("text/plain").build();
Blob blob = storage.create(blobInfo, "Hello, Cloud Storage!".getBytes(UTF_8));
这是我写的单元测试:
namespace foo;
table TestMutate {
serverId:int32;
}
这是测试的输出。
func TestMutateFlatbuffer2(test *testing.T) {
builder := flatbuffers.NewBuilder(1024)
packageWalletStorageServicesRPC.TestMutateStart(builder)
packageWalletStorageServicesRPC.TestMutateAddServerId(builder, 1)
endMessage := packageWalletStorageServicesRPC.TestMutateEnd(builder)
builder.Finish(endMessage)
bytes := builder.FinishedBytes()
testMutate := packageWalletStorageServicesRPC.GetRootAsTestMutate(bytes, 0)
success := testMutate.MutateServerId(2)
if !success {
panic("Server id not mutated.")
} else {
logger.Logf(logger.INFO, "serverId mutated to:%d", testMutate.ServerId())
}
mutatedBytes := testMutate.Table().Bytes
if string(mutatedBytes) == string(bytes) {
panic("Bytes were not mutated.")
}
}
请注意,我似乎已经更改了底层结构,但是当我获得FlatBuffer的字节时, 他们没有改变。问题1:我是否以正确的方式获取字节?问题2:如果我以正确的方式获得它们,为什么 因为mutate调用似乎成功了,所以它们没有改变吗?
答案 0 :(得分:1)
您的测试const st = "[" + ${USER_STATUS.ACTIVE} + "]";
const users = await User.findAll({
attributes: ['id', Sequelize.literal(`"firstName" || ' ' || "lastName" as name`)],
where: { status: st, organizationId: orgId }
});
失败,因为..您正在将变异的缓冲区与自身进行比较。 string(mutatedBytes) == string(bytes)
指的是一个缓冲区,在您的突变之前包含1,之后包含2。bytes
指向同一缓冲区,因此也包含2。事实{{1} } return 2应该告诉您缓冲区已成功突变,因为没有其他方法可以返回2 :)如果您想进行此比较,则必须在突变之前制作mutatedBytes
的(深层)副本以显示缓冲区不同。
答案 1 :(得分:0)
对此问题至少有两种解决方案。就我而言,第二种方法更好,因为它减少了字节的复制。
通过创建中间字符串(因此是字节的副本)。通常,对于flatbuffers,您希望避免复制,但是对于我的用例,我可以接受。
像这样包装表定义:
table LotsOfData {
notMutated:[ubyte];
}
table TestMutate {
notMutated:LotsOfData;
serverId:int32;
}