方法一:golang
serialize 的标准方法:this
方法二:code
下面是本身实现的 serialize 方法,不推荐本身实现,应该用标准方法。对象
代码以下:blog
package main import ( "bytes" "encoding/binary" "fmt" "log" "os" ) //this type represnts a record with three fields type payload struct { Three int32 } func main() { writeFile() readFile() } func readFile() { file, err := os.Open("test.bin") defer file.Close() if err != nil { log.Fatal(err) } m := payload{} for i := 0; i < 10; i++ { data := readNextBytes(file, 4) buffer := bytes.NewBuffer(data) err = binary.Read(buffer, binary.BigEndian, &m) if err != nil { log.Fatal("binary.Read failed", err) } fmt.Println("m is: ", m) } } func readNextBytes(file *os.File, number int) []byte { bytes := make([]byte, number) _, err := file.Read(bytes) if err != nil { log.Fatal(err) } return bytes } func writeFile() { file, err := os.Create("test.bin") defer file.Close() if err != nil { log.Fatal(err) } for i := 0; i < 10; i++ { s := &payload{ int32(i), } fmt.Println(s) var bin_buf bytes.Buffer binary.Write(&bin_buf, binary.BigEndian, s) b := bin_buf.Bytes() l := len(b) fmt.Println("write len: ", l) writeNextBytes(file, b) } } func writeNextBytes(file *os.File, bytes []byte) { _, err := file.Write(bytes) if err != nil { log.Fatal(err) } }
除了将数据放进结构体以外,你还能够直接将数据放进结构体对象的某个成员里:three
binary.Read(buffer, binary.BigEndian, &m.Two)
不过要保证buffer与成员的内存长度同样。内存
# 注意,这里必须注意payload结构里的任何field成员都不能是 int,必须制定成员的byte长度,也即必须使用 int32, int64, float32等等,不能使用 int, float。由于不指定长度若将它存到磁盘并读取回来时会产生歧义,不知道读写多少个byte的。get
另外,若是出现这种错误: reflect: reflect.Value.SetUint using value obtained using unexported field, 是由于payload结构体内的Field的名称小写引发的,改为首字母大写便可。it
若是你向确认结构体是否被正确的赋值了,能够:
bs := make([]byte, 4) binary.LittleEndian.PutUint32(bs, 31415926) fmt.Println(bs)