feature(serialize): refactor

This commit is contained in:
pyihe
2022-08-02 10:52:36 +08:00
parent 9c11cf3297
commit f0631c2321
9 changed files with 145 additions and 89 deletions

View File

@@ -1,6 +1,23 @@
package serialize
type Serializer interface {
Encode(v interface{}) ([]byte, error)
Decode(data []byte, v interface{}) error
import (
"strings"
)
type Codec interface {
Name() string
Marshal(interface{}) ([]byte, error)
Unmarshal([]byte, interface{}) error
}
var (
m = make(map[string]Codec)
)
func Register(c Codec) {
m[strings.ToLower(c.Name())] = c
}
func Get(name string) Codec {
return m[strings.ToLower(name)]
}

View File

@@ -1,23 +0,0 @@
package serialize
import (
"bytes"
"encoding/gob"
)
type gobSerializer struct{}
func Gob() Serializer {
return gobSerializer{}
}
func (gb gobSerializer) Encode(v interface{}) (data []byte, err error) {
buff := bytes.NewBuffer([]byte{})
err = gob.NewEncoder(buff).Encode(v)
data = buff.Bytes()
return
}
func (gb gobSerializer) Decode(data []byte, v interface{}) error {
return gob.NewDecoder(bytes.NewReader(data)).Decode(v)
}

34
serialize/gob/gob.go Normal file
View File

@@ -0,0 +1,34 @@
package gob
import (
"bytes"
"encoding/gob"
"github.com/pyihe/go-pkg/serialize"
)
const Name = "gob"
func init() {
serialize.Register(&gobCodec{})
}
type gobCodec struct {
}
func (g *gobCodec) Name() string {
return Name
}
func (g *gobCodec) Marshal(v interface{}) ([]byte, error) {
buff := bytes.NewBuffer([]byte{})
err := gob.NewEncoder(buff).Encode(v)
if err != nil {
return nil, err
}
return buff.Bytes(), nil
}
func (g *gobCodec) Unmarshal(data []byte, v interface{}) error {
return gob.NewDecoder(bytes.NewReader(data)).Decode(v)
}

View File

@@ -1,17 +0,0 @@
package serialize
import "encoding/json"
type jsonSerializer struct{}
func JSON() Serializer {
return jsonSerializer{}
}
func (js jsonSerializer) Encode(v interface{}) (data []byte, err error) {
return json.Marshal(v)
}
func (js jsonSerializer) Decode(data []byte, v interface{}) error {
return json.Unmarshal(data, v)
}

27
serialize/json/json.go Normal file
View File

@@ -0,0 +1,27 @@
package json
import (
"encoding/json"
"github.com/pyihe/go-pkg/serialize"
)
const Name = "json"
func init() {
serialize.Register(&jsCodec{})
}
type jsCodec struct{}
func (js *jsCodec) Name() string {
return Name
}
func (js *jsCodec) Marshal(v interface{}) ([]byte, error) {
return json.Marshal(v)
}
func (js *jsCodec) Unmarshal(data []byte, v interface{}) error {
return json.Unmarshal(data, v)
}

View File

@@ -1,17 +0,0 @@
package serialize
import "github.com/vmihailenco/msgpack/v5"
type msgPack struct{}
func Msgpack() Serializer {
return msgPack{}
}
func (mp msgPack) Encode(v interface{}) (data []byte, err error) {
return msgpack.Marshal(v)
}
func (mp msgPack) Decode(data []byte, v interface{}) error {
return msgpack.Unmarshal(data, v)
}

View File

@@ -0,0 +1,27 @@
package msgpack
import (
"github.com/pyihe/go-pkg/serialize"
"github.com/vmihailenco/msgpack/v5"
)
const Name = "msgpack"
func init() {
serialize.Register(&msgpackCodec{})
}
type msgpackCodec struct {
}
func (m *msgpackCodec) Name() string {
return Name
}
func (m *msgpackCodec) Marshal(v interface{}) ([]byte, error) {
return msgpack.Marshal(v)
}
func (m *msgpackCodec) Unmarshal(data []byte, v interface{}) error {
return msgpack.Unmarshal(data, v)
}

View File

@@ -1,29 +0,0 @@
package serialize
import (
"errors"
"github.com/golang/protobuf/proto"
)
type protoSerializer struct{}
func Proto() Serializer {
return protoSerializer{}
}
func (ps protoSerializer) Encode(v interface{}) (data []byte, err error) {
if m, ok := v.(proto.Message); ok {
return proto.Marshal(m)
}
err = errors.New("not proto.Message")
return
}
func (ps protoSerializer) Decode(data []byte, v interface{}) (err error) {
if m, ok := v.(proto.Message); ok {
return proto.Unmarshal(data, m)
}
err = errors.New("not proto.Message")
return
}

View File

@@ -0,0 +1,37 @@
package protobuffer
import (
"fmt"
"github.com/golang/protobuf/proto"
"github.com/pyihe/go-pkg/serialize"
)
const Name = "proto"
func init() {
serialize.Register(&protoCodec{})
}
type protoCodec struct {
}
func (p *protoCodec) Name() string {
return Name
}
func (p *protoCodec) Marshal(v interface{}) ([]byte, error) {
vv, ok := v.(proto.Message)
if !ok {
return nil, fmt.Errorf("faild to marshal: message is %T, want proto.Message", v)
}
return proto.Marshal(vv)
}
func (p *protoCodec) Unmarshal(data []byte, v interface{}) error {
vv, ok := v.(proto.Message)
if !ok {
return fmt.Errorf("failed to unmarshal: message is %T, want proto.Message", v)
}
return proto.Unmarshal(data, vv)
}