| // Copyright 2013 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package gob_test | |
| import ( | |
| "bytes" | |
| "encoding/gob" | |
| "fmt" | |
| "log" | |
| ) | |
| // The Vector type has unexported fields, which the package cannot access. | |
| // We therefore write a BinaryMarshal/BinaryUnmarshal method pair to allow us | |
| // to send and receive the type with the gob package. These interfaces are | |
| // defined in the "encoding" package. | |
| // We could equivalently use the locally defined GobEncode/GobDecoder | |
| // interfaces. | |
| type Vector struct { | |
| x, y, z int | |
| } | |
| func (v Vector) MarshalBinary() ([]byte, error) { | |
| // A simple encoding: plain text. | |
| var b bytes.Buffer | |
| fmt.Fprintln(&b, v.x, v.y, v.z) | |
| return b.Bytes(), nil | |
| } | |
| // UnmarshalBinary modifies the receiver so it must take a pointer receiver. | |
| func (v *Vector) UnmarshalBinary(data []byte) error { | |
| // A simple encoding: plain text. | |
| b := bytes.NewBuffer(data) | |
| _, err := fmt.Fscanln(b, &v.x, &v.y, &v.z) | |
| return err | |
| } | |
| // This example transmits a value that implements the custom encoding and decoding methods. | |
| func Example_encodeDecode() { | |
| var network bytes.Buffer // Stand-in for the network. | |
| // Create an encoder and send a value. | |
| enc := gob.NewEncoder(&network) | |
| err := enc.Encode(Vector{3, 4, 5}) | |
| if err != nil { | |
| log.Fatal("encode:", err) | |
| } | |
| // Create a decoder and receive a value. | |
| dec := gob.NewDecoder(&network) | |
| var v Vector | |
| err = dec.Decode(&v) | |
| if err != nil { | |
| log.Fatal("decode:", err) | |
| } | |
| fmt.Println(v) | |
| // Output: | |
| // {3 4 5} | |
| } | |