/
benc.go
123 lines (113 loc) · 2.87 KB
/
benc.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
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
package goserbench
import (
"time"
"github.com/alecthomas/go_serialization_benchmarks/goserbench"
bstd "github.com/deneonet/benc"
"github.com/deneonet/benc/bunsafe"
)
type BENCSerializer struct{}
func (s BENCSerializer) Marshal(o interface{}) (buf []byte, err error) {
v := o.(*goserbench.SmallStruct)
n := bstd.SizeString(v.Name)
n += bstd.SizeInt64()
n += bstd.SizeString(v.Phone)
n += bstd.SizeInt32()
n += bstd.SizeBool()
n += bstd.SizeFloat64()
n, buf = bstd.Marshal(n)
n = bstd.MarshalString(n, buf, v.Name)
n = bstd.MarshalInt64(n, buf, v.BirthDay.UnixNano())
n = bstd.MarshalString(n, buf, v.Phone)
n = bstd.MarshalInt32(n, buf, int32(v.Siblings))
n = bstd.MarshalBool(n, buf, v.Spouse)
n = bstd.MarshalFloat64(n, buf, v.Money)
err = bstd.VerifyMarshal(n, buf)
return
}
func (s BENCSerializer) Unmarshal(bs []byte, o interface{}) (err error) {
v := o.(*goserbench.SmallStruct)
var n int
n, v.Name, err = bstd.UnmarshalString(0, bs)
if err != nil {
return
}
var bday int64
n, bday, err = bstd.UnmarshalInt64(n, bs)
if err != nil {
return
}
v.BirthDay = time.Unix(0, bday)
n, v.Phone, err = bstd.UnmarshalString(n, bs)
if err != nil {
return
}
var sib int32
n, sib, err = bstd.UnmarshalInt32(n, bs)
if err != nil {
return
}
v.Siblings = int(sib)
n, v.Spouse, err = bstd.UnmarshalBool(n, bs)
if err != nil {
return
}
n, v.Money, err = bstd.UnmarshalFloat64(n, bs)
err = bstd.VerifyUnmarshal(n, bs)
return
}
func NewBENCSerializer() Serializer {
return BENCSerializer{}
}
type BENCUnsafeSerializer struct{}
func (s BENCUnsafeSerializer) Marshal(o interface{}) (buf []byte, err error) {
v := o.(*goserbench.SmallStruct)
n := bstd.SizeString(v.Name)
n += bstd.SizeInt64()
n += bstd.SizeString(v.Phone)
n += bstd.SizeInt32()
n += bstd.SizeBool()
n += bstd.SizeFloat64()
n, buf = bstd.Marshal(n)
n = bunsafe.MarshalString(n, buf, v.Name)
n = bstd.MarshalInt64(n, buf, v.BirthDay.UnixNano())
n = bunsafe.MarshalString(n, buf, v.Phone)
n = bstd.MarshalInt32(n, buf, int32(v.Siblings))
n = bstd.MarshalBool(n, buf, v.Spouse)
n = bstd.MarshalFloat64(n, buf, v.Money)
err = bstd.VerifyMarshal(n, buf)
return
}
func (s BENCUnsafeSerializer) Unmarshal(bs []byte, o interface{}) (err error) {
var n int
v := o.(*goserbench.SmallStruct)
n, v.Name, err = bunsafe.UnmarshalString(0, bs)
if err != nil {
return
}
var bday int64
n, bday, err = bstd.UnmarshalInt64(n, bs)
if err != nil {
return
}
v.BirthDay = time.Unix(0, bday)
n, v.Phone, err = bunsafe.UnmarshalString(n, bs)
if err != nil {
return
}
var sib int32
n, sib, err = bstd.UnmarshalInt32(n, bs)
if err != nil {
return
}
v.Siblings = int(sib)
n, v.Spouse, err = bstd.UnmarshalBool(n, bs)
if err != nil {
return
}
n, v.Money, err = bstd.UnmarshalFloat64(n, bs)
err = bstd.VerifyUnmarshal(n, bs)
return
}
func NewBENCUnsafeSerializer() Serializer {
return BENCUnsafeSerializer{}
}