-
Notifications
You must be signed in to change notification settings - Fork 0
/
gob.go
75 lines (67 loc) · 2.15 KB
/
gob.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
// Copyright 2016-2017
// CoderG the 2016 project
// Insight 0+0 [ 洞悉 0+0 ]
// InDimensions Construct Source [ 忆黛蒙逝·建造源 ]
// Normal Fire Meditation Qin [ 火志溟 ] -> firemeditation@gmail.com
// Use of this source code is governed by GNU LGPL v3 license
package nst
import (
"bytes"
"encoding/gob"
"reflect"
"github.com/idcsource/insight00-lib/roles"
)
// 将结构体数据转成Gob再转成[]Byte
func StructGobBytes(e interface{}) ([]byte, error) {
var gob_buff bytes.Buffer //建立缓冲
gob_en := gob.NewEncoder(&gob_buff) //gob开始编码
err := gob_en.Encode(e) //gob编码
if err != nil {
return nil, err
}
gob_b := gob_buff.Bytes() //bytes.buffer转[]byte
return gob_b, nil
}
// 将[]byte转成Gob再转成结构体
func BytesGobStruct(f_b []byte, stur interface{}) error {
b_buf := bytes.NewBuffer(f_b) //将[]byte放入bytes的buffer中
b_go := gob.NewDecoder(b_buf) //将buffer放入gob的decoder中
err := b_go.Decode(stur) //将gob解码放入stur
if err != nil {
return err
} else {
return nil
}
}
// 将roles.Roleer接口的结构体数据转成Gob再转成[]Byte,需要提前用encoding/gob包中的Register方法注册符合roles.Roleer接口的数据类型。
func StructGobBytesForRoleer(p roles.Roleer) ([]byte, error) {
var network bytes.Buffer
enc := gob.NewEncoder(&network)
err := enc.Encode(&p)
if err != nil {
return nil, err
}
return network.Bytes(), nil
}
// 将[]byte转成Gob再转成roles.Roleer接口的结构体,需要提前用encoding/gob包中的Register方法注册符合roles.Roleer接口的数据类型。
func BytesGobStructForRoleer(by []byte) (roles.Roleer, error) {
var p roles.Roleer
network := bytes.NewBuffer(by)
dec := gob.NewDecoder(network)
err := dec.Decode(&p)
if err != nil {
return nil, err
}
return p, nil
}
// 将[]byte转成提供的反射Value
func BytesGobReflect(f_b []byte, v reflect.Value) error {
b_buf := bytes.NewBuffer(f_b) //将[]byte放入bytes的buffer中
b_go := gob.NewDecoder(b_buf) //将buffer放入gob的decoder中
err := b_go.DecodeValue(v) //将gob解码放入
if err != nil {
return err
} else {
return nil
}
}