amino编码

amino 编码

amino是Proto3的子集同时扩展了接口的支持。

  1. 和json对比,二进制序列化效率更高。
  2. 和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字节以消除不确定性。

缺点

  1. amino一个很大的好处是不需要写proto文件了,缺点目前还不能跨平台。
  2. 不支持枚举,浮点型和map。实际上这个对区块链应用不是什么缺点,区块链应用为了确定性,也不会选择使用浮点型和map,而枚举类型可以用byte数组代替。

你可能感兴趣的:(amino编码)