Files
go-pkg/encoding/encoding.go
2021-06-29 21:48:49 +08:00

100 lines
1.9 KiB
Go

package encoding
import (
"bytes"
"encoding/gob"
"encoding/json"
"errors"
"github.com/golang/protobuf/proto"
"github.com/vmihailenco/msgpack/v5"
)
type Encoding interface {
Marshal(v interface{}) ([]byte, error)
Unmarshal(data []byte, v interface{}) error
}
// JSONEncoding json格式
func JSONEncoding() Encoding {
return &jsonEncoding{}
}
// GobEncoding
func GobEncoding() Encoding {
return &gobEncoding{}
}
// MsgpackEncoding
func MsgpackEncoding() Encoding {
return &msgpackEncoding{}
}
// ProtoEncoding
func ProtoEncoding() Encoding {
return &protoEncoding{}
}
/***JSON Marshaler***/
type jsonEncoding struct{}
// Marshal
func (j *jsonEncoding) Marshal(v interface{}) ([]byte, error) {
return json.Marshal(v)
}
// Unmarshal
func (j *jsonEncoding) Unmarshal(data []byte, v interface{}) error {
return json.Unmarshal(data, v)
}
/***gob Marshaler***/
type gobEncoding struct{}
// Marshal
func (g *gobEncoding) Marshal(v interface{}) ([]byte, error) {
var b = bytes.NewBuffer(nil)
err := gob.NewEncoder(b).Encode(v)
return b.Bytes(), err
}
// Unmarshal
func (g *gobEncoding) Unmarshal(data []byte, v interface{}) error {
return gob.NewDecoder(bytes.NewReader(data)).Decode(v)
}
/***msgpack Marshaler***/
type msgpackEncoding struct{}
// Marshal
func (m *msgpackEncoding) Marshal(v interface{}) ([]byte, error) {
return msgpack.Marshal(v)
}
// Unmarshal
func (m *msgpackEncoding) Unmarshal(data []byte, v interface{}) error {
return msgpack.Unmarshal(data, v)
}
/***proto Encoding***/
type protoEncoding struct{}
// Marshal
func (p *protoEncoding) Marshal(v interface{}) ([]byte, error) {
m, ok := v.(proto.Message)
if !ok {
return nil, errors.New("not proto.Message")
}
return proto.Marshal(m)
}
// Unmarshal
func (p *protoEncoding) Unmarshal(data []byte, v interface{}) error {
m, ok := v.(proto.Message)
if !ok {
return errors.New("not proto.Message")
}
return proto.Unmarshal(data, m)
}