amino 编码
amino是Proto3的子集同时扩展了接口的支持。
- 和json对比,二进制序列化效率更高。
- 和Proto3比较,虽然有oneof的关键字,但是在高级语言里不能自动左实现和接口的转换。
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
}
这是一个codec的结构,包含了注册的接口,注册的实现信息。
- 注册接口时,会遍历所有的具体实现,看是否实现了该接口,如果实现了,会添加到自己的TypesInfo中,TypesInfo维护了
Implementers map[PrefixBytes][]*TypeInfo
- 注册实现时,会遍历所有的接口,如果实现了该接口,会添加到对应接口的实现列表里。自身会根据注册的名称生成一个prefix,和disamb数字。(hash生成)
在序列化时,首先binary包用普通的方法对struct和值类型进行二进制化,最后添加四个字节prefix前缀。为了避免prefix冲突,如果一个interface同一个prefix有多个实现,还会在prefix的前面添加disamb字节以消除不确定性。
缺点
- amino一个很大的好处是不需要写proto文件了,缺点目前还不能跨平台。
- 不支持枚举,浮点型和map。实际上这个对区块链应用不是什么缺点,区块链应用为了确定性,也不会选择使用浮点型和map,而枚举类型可以用byte数组代替。