...
1 package cache
2
3 import (
4 "bytes"
5 "encoding/gob"
6 "reflect"
7 "strconv"
8 )
9
10 func serialize(value interface{}) ([]byte, error) {
11 if bytes, ok := value.([]byte); ok {
12 return bytes, nil
13 }
14
15 switch v := reflect.ValueOf(value); v.Kind() {
16 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
17 return []byte(strconv.FormatInt(v.Int(), 10)), nil
18 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
19 return []byte(strconv.FormatUint(v.Uint(), 10)), nil
20 }
21
22 var b bytes.Buffer
23 encoder := gob.NewEncoder(&b)
24 if err := encoder.Encode(value); err != nil {
25 return nil, err
26 }
27 return b.Bytes(), nil
28 }
29
30 func deserialize(byt []byte, ptr interface{}) (err error) {
31 if bytes, ok := ptr.(*[]byte); ok {
32 *bytes = byt
33 return nil
34 }
35
36 if v := reflect.ValueOf(ptr); v.Kind() == reflect.Ptr {
37 switch p := v.Elem(); p.Kind() {
38 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
39 var i int64
40 i, err = strconv.ParseInt(string(byt), 10, 64)
41 if err != nil {
42 return err
43 } else {
44 p.SetInt(i)
45 }
46 return nil
47
48 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
49 var i uint64
50 i, err = strconv.ParseUint(string(byt), 10, 64)
51 if err != nil {
52 return err
53 } else {
54 p.SetUint(i)
55 }
56 return nil
57 }
58 }
59
60 b := bytes.NewBuffer(byt)
61 decoder := gob.NewDecoder(b)
62 if err = decoder.Decode(ptr); err != nil {
63 return err
64 }
65 return nil
66 }
67
View as plain text