Как сериализовать вложенную структуру с кодированием GOB в GoLang? - PullRequest
0 голосов
/ 02 января 2019

У меня есть несколько примеров вложенных структур, и мне нужно их сериализовать. Я использую библиотеку encoding/gob, которая должна преобразовывать данные структуры в байты, а библиотеку encoding/base64 для преобразования байтов в читаемый формат base64. Однако, когда я запускаю свой пример кода, я получаю ошибку serialization error. Я не понимаю, почему это происходит и как решить проблему.

Я последовал этому примеру: Golang сериализует и десериализует обратно

Вот код:

основной пакет

import (
    "bytes"
    "encoding/base64"
    "encoding/gob"
    "errors"
    "fmt"
)

type Hello struct {
    greeting string
}

type Bye struct {
    helloSaid Hello
    byesaid Hello
}


func (b1 Bye) Serialize() (string, error) {
    b := bytes.Buffer{}
    e := gob.NewEncoder(&b)
    err := e.Encode(b1)
    if err != nil {
        return string(b.Bytes()[:]), errors.New("serialization failed")
    }
    return base64.StdEncoding.EncodeToString(b.Bytes()), nil
}

func DeserializeBye(str string) (Bye, error) {
    m := Bye{}
    by, err := base64.StdEncoding.DecodeString(str)
    if err != nil {
        return m, errors.New("deserialization failed")
    }
    b := bytes.Buffer{}
    b.Write(by)
    d := gob.NewDecoder(&b)
    err = d.Decode(&m)
    if err != nil {
        return m, errors.New("deserialization failed")
    }
    return m, nil
}

func main() {
    h := Hello{greeting: "hello"}
    b := Bye{helloSaid: h, byesaid: h}
    serialized, err := b.Serialize()
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(serialized)
}

1 Ответ

0 голосов
/ 02 января 2019

Пожалуйста, сделайте поля структур Hello и Bye общедоступными. Пожалуйста, смотрите документацию для gob пакета :

Структуры кодируют и декодируют только экспортированные поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...