我遇到了從字節改變平面緩沖區的問題。根據 flatbuffer 文檔(https://github.com/google/flatbuffers/blob/master/docs/source/Tutorial.md),您可以改變固定大小的字段,例如 int32。如下所示,生成的 golang TestMutate 有一個 MutateServerId() 函數。我的問題是,在我改變它之后,字節似乎沒有改變。這是我的平面緩沖區表定義: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.") }}這是測試的輸出。=== RUN TestMutateFlatbuffer22019/08/01 19:33:56.801926 foo_test.go:389 : [ I ]: serverId mutated to:2--- FAIL: TestMutateFlatbuffer2 (0.00s)panic: Bytes were not mutated. [recovered] panic: Bytes were not mutated.請注意,我似乎已經改變了底層結構,但是當我獲取平面緩沖區的字節時,它們并沒有改變。問題 1:我是否以正確的方式獲取字節?問題 2:如果我以正確的方式獲取它們,為什么自從對 mutate 的調用似乎成功以來它們沒有改變?
2 回答

繁星coding
TA貢獻1797條經驗 獲得超4個贊
您的測試string(mutatedBytes) == string(bytes)
失敗了,因為..您正在將突變的緩沖區與其自身進行比較。bytes
指的是一個緩沖區,在你的突變之前包含一個 1,在它包含一個 2 之后。mutatedBytes
指向同一個緩沖區,因此也包含一個 2。testMutate.ServerId()
返回 2 的事實應該告訴你緩沖區已成功突變,因為有沒有其他方法可以返回 2 :)bytes
如果您希望通過比較來顯示緩沖區不同,則必須在突變之前制作一個(深層)副本。

四季花海
TA貢獻1811條經驗 獲得超5個贊
這個問題至少有兩種解決方案。對于我來說,第二種解決方案更好,因為它會減少字節的復制。
通過創建一個中間字符串(因此,創建字節的副本)。一般來說,對于平面緩沖區,您希望避免復制,但對于我的用例,我對此表示同意。
像這樣包裝表定義:
table LotsOfData {
notMutated:[ubyte];
}
table TestMutate {
notMutated:LotsOfData;
serverId:int32;
}
- 2 回答
- 0 關注
- 176 瀏覽
添加回答
舉報
0/150
提交
取消