github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/encoding/kmgGob/kmgGob.go (about) 1 package kmgGob 2 3 import ( 4 "bytes" 5 "encoding/gob" 6 "io" 7 "os" 8 9 "github.com/bronze1man/kmg/kmgFile" 10 "github.com/bronze1man/kmg/kmgIo" 11 ) 12 13 func WriteFile(path string, obj interface{}) (err error) { 14 err = kmgFile.MkdirForFile(path) 15 if err != nil { 16 return err 17 } 18 f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.FileMode(0666)) 19 if err != nil { 20 return 21 } 22 defer f.Close() 23 encoder := gob.NewEncoder(f) 24 return encoder.Encode(obj) 25 } 26 27 func MustWriteFile(path string, obj interface{}) { 28 err := WriteFile(path, obj) 29 if err != nil { 30 panic(err) 31 } 32 } 33 34 func ReadFile(path string, obj interface{}) (err error) { 35 f, err := os.OpenFile(path, os.O_RDONLY, os.FileMode(0666)) 36 if err != nil { 37 return 38 } 39 defer f.Close() 40 encoder := gob.NewDecoder(f) 41 return encoder.Decode(obj) 42 } 43 44 func MustReadFile(path string, obj interface{}) { 45 err := ReadFile(path, obj) 46 if err != nil { 47 panic(err) 48 } 49 } 50 51 func Marshal(obj interface{}) (out []byte, err error) { 52 b := &bytes.Buffer{} 53 encoder := gob.NewEncoder(b) 54 err = encoder.Encode(obj) 55 if err != nil { 56 return 57 } 58 return b.Bytes(), nil 59 } 60 61 func MustMarshal(obj interface{}) (out []byte) { 62 out, err := Marshal(obj) 63 if err != nil { 64 panic(err) 65 } 66 return out 67 } 68 func Unmarshal(data []byte, obj interface{}) (err error) { 69 b := bytes.NewBuffer(data) 70 encoder := gob.NewDecoder(b) 71 err = encoder.Decode(obj) 72 return 73 } 74 func MustUnmarshal(data []byte, obj interface{}) { 75 err := Unmarshal(data, obj) 76 if err != nil { 77 panic(err) 78 } 79 return 80 } 81 82 // 创建一个没有中间buf的gobDecode , 83 // 系统已有的gob.NewDecoder, 会在Reader不是一个ByteReader时, 使用bufio 进行读取, 84 // 根据 gob.NewDecoder 的代码显示 使用singleReader可以解决问题 85 func NewNonBufDecode(r io.Reader) *gob.Decoder { 86 return gob.NewDecoder(kmgIo.NewSingleByteReader(r)) 87 }