1// Copyright 2013 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package gob_test 6 7import ( 8 "bytes" 9 "encoding/gob" 10 "fmt" 11 "log" 12) 13 14// The Vector type has unexported fields, which the package cannot access. 15// We therefore write a BinaryMarshal/BinaryUnmarshal method pair to allow us 16// to send and receive the type with the gob package. These interfaces are 17// defined in the "encoding" package. 18// We could equivalently use the locally defined GobEncode/GobDecoder 19// interfaces. 20type Vector struct { 21 x, y, z int 22} 23 24func (v Vector) MarshalBinary() ([]byte, error) { 25 // A simple encoding: plain text. 26 var b bytes.Buffer 27 fmt.Fprintln(&b, v.x, v.y, v.z) 28 return b.Bytes(), nil 29} 30 31// UnmarshalBinary modifies the receiver so it must take a pointer receiver. 32func (v *Vector) UnmarshalBinary(data []byte) error { 33 // A simple encoding: plain text. 34 b := bytes.NewBuffer(data) 35 _, err := fmt.Fscanln(b, &v.x, &v.y, &v.z) 36 return err 37} 38 39// This example transmits a value that implements the custom encoding and decoding methods. 40func Example_encodeDecode() { 41 var network bytes.Buffer // Stand-in for the network. 42 43 // Create an encoder and send a value. 44 enc := gob.NewEncoder(&network) 45 err := enc.Encode(Vector{3, 4, 5}) 46 if err != nil { 47 log.Fatal("encode:", err) 48 } 49 50 // Create a decoder and receive a value. 51 dec := gob.NewDecoder(&network) 52 var v Vector 53 err = dec.Decode(&v) 54 if err != nil { 55 log.Fatal("decode:", err) 56 } 57 fmt.Println(v) 58 59 // Output: 60 // {3 4 5} 61} 62