/
msgp.go
80 lines (62 loc) · 1.37 KB
/
msgp.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package serializers
import (
"bytes"
"github.com/go-bond/bond/utils"
"github.com/vmihailenco/msgpack/v5"
)
type MsgpackSerializer struct {
Encoder utils.SyncPool[*msgpack.Encoder]
Decoder utils.SyncPool[*msgpack.Decoder]
Buffer utils.SyncPool[bytes.Buffer]
}
func (m *MsgpackSerializer) Serialize(i interface{}) ([]byte, error) {
if m.Encoder != nil {
var (
enc = m.Encoder.Get()
buff = m.getBuffer()
)
enc.Reset(&buff)
err := enc.Encode(i)
if err != nil {
return nil, err
}
m.Encoder.Put(enc)
return buff.Bytes(), nil
}
return msgpack.Marshal(i)
}
func (m *MsgpackSerializer) SerializerWithCloseable(i interface{}) ([]byte, func(), error) {
if m.Encoder != nil {
var (
enc = m.Encoder.Get()
buff = m.getBuffer()
)
enc.Reset(&buff)
err := enc.Encode(i)
if err != nil {
return nil, nil, err
}
m.Encoder.Put(enc)
closeable := func() {
m.freeBuffer(buff)
}
return buff.Bytes(), closeable, nil
}
b, err := msgpack.Marshal(i)
return b, func() {}, err
}
func (m *MsgpackSerializer) Deserialize(b []byte, i interface{}) error {
return msgpack.Unmarshal(b, i)
}
func (m *MsgpackSerializer) getBuffer() bytes.Buffer {
if m.Buffer != nil {
return m.Buffer.Get()
} else {
return bytes.Buffer{}
}
}
func (m *MsgpackSerializer) freeBuffer(buffer bytes.Buffer) {
if m.Buffer != nil {
m.Buffer.Put(buffer)
}
}