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  }