Reputation: 6844
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
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.
Upvotes: 0
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() }
Implement GobDecoder and GobEncoder
func (*Something) GobDecode([]byte) error { return nil }
func (Something) GobEncode() ([]byte, error) { return nil, nil }
Upvotes: 4