亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Flatbuffer mutate 不會改變字節

Flatbuffer mutate 不會改變字節

Go
墨色風雨 2023-07-10 14:40:15
我遇到了從字節改變平面緩沖區的問題。根據 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如果您希望通過比較來顯示緩沖區不同,則必須在突變之前制作一個(深層)副本。



查看完整回答
反對 回復 2023-07-10
?
四季花海

TA貢獻1811條經驗 獲得超5個贊

這個問題至少有兩種解決方案。對于我來說,第二種解決方案更好,因為它會減少字節的復制。

  1. 通過創建一個中間字符串(因此,創建字節的副本)。一般來說,對于平面緩沖區,您希望避免復制,但對于我的用例,我對此表示同意。

  2. 像這樣包裝表定義:


    table LotsOfData {

        notMutated:[ubyte];

    }


    table TestMutate {

        notMutated:LotsOfData;

        serverId:int32;

    }


查看完整回答
反對 回復 2023-07-10
  • 2 回答
  • 0 關注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號