mirror of
https://github.com/pyihe/go-pkg.git
synced 2025-10-23 07:59:27 +08:00
feature(serialize): refactor
This commit is contained in:
@@ -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)]
|
||||
}
|
||||
|
@@ -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
34
serialize/gob/gob.go
Normal 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)
|
||||
}
|
@@ -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
27
serialize/json/json.go
Normal 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)
|
||||
}
|
@@ -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)
|
||||
}
|
27
serialize/msgpack/msgpack.go
Normal file
27
serialize/msgpack/msgpack.go
Normal 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)
|
||||
}
|
@@ -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
|
||||
}
|
37
serialize/protobuffer/proto.go
Normal file
37
serialize/protobuffer/proto.go
Normal 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)
|
||||
}
|
Reference in New Issue
Block a user