Franck Jeannin
Franck Jeannin

Reputation: 6844

How to tell Golang Gob encoding that it’s ok to serialize a struct that contains a struct with no exported fields

I believe this is a legitimate use case for Gob serialization. Yet enc.Encode returns an error because Something has no exported field. Note that I’m not serializing Something directly but only Composed that contains exported fields.

The only workaround I’ve found was to add a Dummy (exported) value to Something. This is ugly. Is there a more elegant solution?

https://play.golang.org/p/0pL6BfBb78m

package main

import (
    "bytes"
    "encoding/gob"
)

type Something struct {
    temp int
}

func (*Something) DoSomething() {}

type Composed struct {
    Something
    DataToSerialize int
}

func main() {
    enc := gob.NewEncoder(&bytes.Buffer{})
    err := enc.Encode(Composed{})
    if err != nil {
        panic(err)
    }
}

Upvotes: 6

Views: 4014

Answers (2)

Jon Mandrell
Jon Mandrell

Reputation: 16

As far as I can tell the addition of the functions GobDecode and GobEncode only allow the encoder to avoid the error, but don't allow it to work correctly. If I add a Decode operation it doesn't seem to get the DataToSerialize item back with the value I encoded into it.

Playground example

Upvotes: 0

Thundercat
Thundercat

Reputation: 120931

Here are some different workarounds from that proposed in the question.

Don't use embedding.

type Composed struct {
    something       Something
    DataToSerialize int
}

func (c *Composed) DoSomething() { c.something.DoSomething() }

playground example

Implement GobDecoder and GobEncoder

func (*Something) GobDecode([]byte) error     { return nil }
func (Something) GobEncode() ([]byte, error) { return nil, nil }

playground example

Upvotes: 4

Related Questions