1. 序列化
上篇sibo协议的定制里其header部分包含了序列化类型及压缩类型的定义。
由于序列化为占用3个bit,因此最多可支持8种序列化方式。同理,压缩类型最多支持4种。
sibo协议定义支持的序列化类型如下(共5种):
const (
SerializeNone SerializeType = iota // 原始二进制
JSON
ProtoBuffer //protobuf
MsgPack
Bson
)
接下来我们来实现这5中序列化方式:
1) 通用调用接口
type Codec interface {
Encode(i interface{})([]byte, error)
Decode(data []byte, i interface{}) error
}
2) 原始二进制编解码
// ByteCodec uses original bytes.
// 原始二进制编解码
type ByteCodec struct {}
func (c ByteCodec) Encode(i interface{}) ([]byte, error) {
if data, ok := i.([]byte); ok {
return data, nil
}
return nil, fmt.Errorf("%T is not a []byte", i)
}
func (c ByteCodec) Decode(data []byte, i interface{}) error {
if _,ok:=i.([]byte);!ok {
return errors.New("i is not type of []byte")
}
reflect.ValueOf(i).SetBytes(data)
return nil
}
3) JSON编解码