amino編碼

amino 編碼

amino是Proto3的子集同時(shí)擴(kuò)展了接口的支持。

  1. 和json對比,二進(jìn)制序列化效率更高。
  2. 和Proto3比較,雖然有oneof的關(guān)鍵字,但是在高級語言里不能自動(dòng)左實(shí)現(xiàn)和接口的轉(zhuǎn)換。
type Codec struct {
    mtx              sync.RWMutex
    sealed           bool
    typeInfos        map[reflect.Type]*TypeInfo
    interfaceInfos   []*TypeInfo
    concreteInfos    []*TypeInfo
    disfixToTypeInfo map[DisfixBytes]*TypeInfo
    nameToTypeInfo   map[string]*TypeInfo
}

這是一個(gè)codec的結(jié)構(gòu),包含了注冊的接口,注冊的實(shí)現(xiàn)信息。

  • 注冊接口時(shí),會(huì)遍歷所有的具體實(shí)現(xiàn),看是否實(shí)現(xiàn)了該接口,如果實(shí)現(xiàn)了,會(huì)添加到自己的TypesInfo中,TypesInfo維護(hù)了 Implementers map[PrefixBytes][]*TypeInfo
  • 注冊實(shí)現(xiàn)時(shí),會(huì)遍歷所有的接口,如果實(shí)現(xiàn)了該接口,會(huì)添加到對應(yīng)接口的實(shí)現(xiàn)列表里。自身會(huì)根據(jù)注冊的名稱生成一個(gè)prefix,和disamb數(shù)字。(hash生成)

在序列化時(shí),首先binary包用普通的方法對struct和值類型進(jìn)行二進(jìn)制化,最后添加四個(gè)字節(jié)prefix前綴。為了避免prefix沖突,如果一個(gè)interface同一個(gè)prefix有多個(gè)實(shí)現(xiàn),還會(huì)在prefix的前面添加disamb字節(jié)以消除不確定性。

缺點(diǎn)

  1. amino一個(gè)很大的好處是不需要寫proto文件了,缺點(diǎn)目前還不能跨平臺(tái)。
  2. 不支持枚舉,浮點(diǎn)型和map。實(shí)際上這個(gè)對區(qū)塊鏈應(yīng)用不是什么缺點(diǎn),區(qū)塊鏈應(yīng)用為了確定性,也不會(huì)選擇使用浮點(diǎn)型和map,而枚舉類型可以用byte數(shù)組代替。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容