• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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