Flatbuffer mutate不会更改字节

时间:2019-08-01 23:39:55

标签: go flatbuffers

我遇到了一个问题,即从字节中更改了平面缓冲区。根据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调用似乎成功了,所以它们没有改变吗?

2 个答案:

答案 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)

对此问题至少有两种解决方案。就我而言,第二种方法更好,因为它减少了字节的复制。

  1. 通过创建中间字符串(因此是字节的副本)。通常,对于flatbuffers,您希望避免复制,但是对于我的用例,我可以接受。

  2. 像这样包装表定义:


    table LotsOfData {
        notMutated:[ubyte];
    }

    table TestMutate {
        notMutated:LotsOfData;
        serverId:int32;
    }