Как сообщить кодировке Golang Gob, что можно сериализовать структуру, которая содержит структуру без экспортируемых полей - PullRequest
0 голосов
/ 16 мая 2018

Я считаю, что это законный вариант использования для сериализации Gob. Все же enc.Encode возвращает ошибку, потому что Something не имеет экспортированного поля. Обратите внимание, что я не сериализую Something напрямую, а только Composed, который содержит экспортированные поля.

Единственный найденный мной обходной путь - добавить Dummy (экспортированное) значение к Something. Это безобразно Есть ли более элегантное решение?

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)
    }
}

1 Ответ

0 голосов
/ 16 мая 2018

Вот несколько других обходных путей по сравнению с предложенным в вопросе.

Не используйте встраивание.

type Composed struct {
    something       Something
    DataToSerialize int
}

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

пример детской площадки

Реализация GobDecoder и GobEncoder

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

пример детской площадки

...