-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserializer_func.go
More file actions
128 lines (106 loc) · 3.06 KB
/
serializer_func.go
File metadata and controls
128 lines (106 loc) · 3.06 KB
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package cmap
import (
"bytes"
"cmp"
"encoding/gob"
"encoding/json"
"sync"
"github.com/bytedance/sonic"
jsoniter "github.com/json-iterator/go"
)
// ---------------------------------------------------------------------------------------------------------------------
// Tuple 用于序列化的键值对
type Tuple[K cmp.Ordered, V any] struct {
Key K `json:"key"`
Value V `json:"value"`
}
// SerializableData 可序列化的数据结构
type SerializableData[K cmp.Ordered, V any] struct {
Items []Tuple[K, V] `json:"items"`
}
// ---------------------------------------------------------------------------------------------------------------------
type SerializerFunc struct {
NameFunc func() string
MarshalFunc func(v interface{}) ([]byte, error)
UnmarshalFunc func(data []byte, v interface{}) error
isJSON bool // 标记是否为JSON序列化器
}
func (s *SerializerFunc) Name() string {
return s.NameFunc()
}
func (s *SerializerFunc) Marshal(v interface{}) ([]byte, error) {
return s.MarshalFunc(v)
}
func (s *SerializerFunc) Unmarshal(data []byte, v interface{}) error {
return s.UnmarshalFunc(data, v)
}
// IsJSON 实现JSONCompatible接口
func (s *SerializerFunc) IsJSON() bool {
return s.isJSON
}
// ---------------------------------------------------------------------------------------------------------------------
func JsonSerializer() *SerializerFunc {
return &SerializerFunc{
NameFunc: func() string { return "json" },
MarshalFunc: json.Marshal,
UnmarshalFunc: json.Unmarshal,
isJSON: true,
}
}
func JsoniterSerializer() *SerializerFunc {
return &SerializerFunc{
NameFunc: func() string { return "jsoniter" },
MarshalFunc: jsoniter.Marshal,
UnmarshalFunc: jsoniter.Unmarshal,
isJSON: true,
}
}
func SonicSerializer() *SerializerFunc {
return &SerializerFunc{
NameFunc: func() string { return "sonic" },
MarshalFunc: sonic.Marshal,
UnmarshalFunc: sonic.Unmarshal,
isJSON: true,
}
}
// gobBufferPool 用于复用bytes.Buffer
var gobBufferPool = sync.Pool{
New: func() interface{} {
return new(bytes.Buffer)
},
}
func GobSerializer() *SerializerFunc {
return &SerializerFunc{
NameFunc: func() string { return "gob" },
MarshalFunc: func(v interface{}) ([]byte, error) {
// 从池中获取buffer
buf := gobBufferPool.Get().(*bytes.Buffer)
defer func() {
buf.Reset()
gobBufferPool.Put(buf)
}()
// 创建encoder
enc := gob.NewEncoder(buf)
err := enc.Encode(v)
if err != nil {
return nil, err
}
// 返回buffer的副本,避免数据竞争
return append([]byte(nil), buf.Bytes()...), nil
},
UnmarshalFunc: func(data []byte, v interface{}) error {
// 从池中获取buffer
buf := gobBufferPool.Get().(*bytes.Buffer)
defer func() {
buf.Reset()
gobBufferPool.Put(buf)
}()
// 将数据写入buffer
buf.Write(data)
// 创建decoder
dec := gob.NewDecoder(buf)
return dec.Decode(v)
},
}
}
// ---------------------------------------------------------------------------------------------------------------------