Flatbuffer使用

google做到protobuf很多人都用过,但是google还有一个类似的产品,FlatBuffer。

区别在于pbf做了压缩,传输量比较小,编解码相对比较快,与rapidjson类似,而FlatBuffer并不压缩,所以编解码更快,但是数据量也会更大;

Flatbuffer产生一个很小的头文件,编码的方式是半手动的,使用方式和rapidjson很象,但是函数设计的更加恶心。但是有些时候必须要用,比如改造的项目!

首先我们写一个定义文件proto.fbs

namespace Msg;

table Block {
 id: long;
 hash: string;
 children: [Tx];
}

table Tx {
 name: string;
 hash: string;
 value: double;
}

root_type Block;

使用编译一下,生成相关的文件:

./flatc.exe -g ./pro.fbs

生成了一个目录,Msg里面有2个文件,

还需要下载相关的库:

go get -v github.com/google/flatbuffers/go

备注:某些时候不好下载,使用移动热点;

写一个编码的测试文件:

package main

//  ./flatc.exe -g ./pro.fbs

import (
	"fmt"

	fbs "./Msg"

	flatbuffers "github.com/google/flatbuffers/go"
)

type Tx struct {
	Name  string
	Hash  string
	Value float64
}

type Block struct {
	Id       int64
	Hash     string
	Children []Tx
}

func DecodeToBlock(buf []byte) Block {
	var (
		block Block
	)
	// buf, err := ioutil.ReadFile(filename)
	// if err != nil {
	//     panic(err)
	// }
	//传入二进制数据
	b := fbs.GetRootAsBlock(buf, 0)
	block.Hash = string(b.Hash())
	block.Id = b.Id()
	len := b.ChildrenLength()
	for i := 0; i < len; i++ {
		tx_f := new(fbs.Tx)
		tx := new(Tx)
		if b.Children(tx_f, i) {
			tx.Hash = string(tx_f.Hash())
			tx.Value = tx_f.Value()
		}
		//append(block.Children, *tx)
		fmt.Println("child:", tx)
	}
	return block
}

func main() {
	tx1 := Tx{Name: "robin", Hash: "0", Value: 123}
	tx2 := Tx{Name: "fox", Hash: "1", Value: 456}
	block := Block{Id: 1, Hash: "2"}

	//初始化buffer,大小为0,会自动扩容
	builder := flatbuffers.NewBuilder(0)
	//第一个交易cd
	tx1_hash := builder.CreateString(tx1.Hash)
	fbs.TxStart(builder)

	fbs.TxAddHash(builder, tx1_hash)
	fbs.TxAddValue(builder, tx1.Value)
	ntx1 := fbs.TxEnd(builder)

	//第二个交易
	tx2_hash := builder.CreateString(tx2.Hash)
	fbs.TxStart(builder)
	fbs.TxAddHash(builder, tx2_hash)
	fbs.TxAddValue(builder, tx2.Value)
	ntx2 := fbs.TxEnd(builder)

	//block
	//先处理数组,string等非标量
	fbs.BlockStartChildrenVector(builder, 2)
	builder.PrependUOffsetT(ntx1)
	builder.PrependUOffsetT(ntx2)
	txs := builder.EndVector(2)

	//再处理标量
	b1_hash := builder.CreateString(block.Hash)
	fbs.BlockStart(builder)
	fbs.BlockAddId(builder, block.Id)
	fbs.BlockAddHash(builder, b1_hash)
	fbs.BlockAddChildren(builder, txs)
	nb1 := fbs.BlockEnd(builder)

	builder.Finish(nb1)
	buf := builder.FinishedBytes() //返回[]byte
	fmt.Println(buf)

	DecodeToBlock(buf)
}

备注:在文件开始,我们定义了结构体,并作为实体类使用;而自动生成的类无法这样使用,仅仅能用来辅助序列化而已,真是太恶心了;还不如某些json库好用;

这里每个字符串都需要提起生成,然后把偏移添加到builder里,而浮点数不需要;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mnn flatbuffer是指使用Flatbuffers库来处理MNN(Mobile Neural Network)模型的二进制缓存文件。在MNN中,它使用Flatbuffers来序列化和反序列化模型数据,以实现高效的加载和传输。通过使用Flatbuffers,MNN可以快速地将模型数据序列化为二进制buffer,并在需要时快速反序列化,从而提高了加载模型的速度。此外,Flatbuffers还具有占用空间小、使用简单、代码自动化生成等优点,使其在移动端应用中更加适用。因此,mnn flatbuffer是指使用Flatbuffers来处理MNN模型缓存的方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MNN Interpreter and Session](https://blog.csdn.net/yiran103/article/details/108552734)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [序列化与反序列化之Flatbuffers(一):初步使用](https://blog.csdn.net/hsqyc/article/details/115719054)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值