Десериализация неизвестного сгустка Го

У меня есть сиськи неизвестного типа. Есть ли способ распечатать его для просмотра внутри?

Там может быть gob.Debug но это не доступно для меня https://golang.org/src/encoding/gob/debug.go

Советы по поиску в Google DecodeValue но требует инициализации reflect.Value Если я получаю неизвестный BLOB-объект, то я не могу передать инициализированное значение неизвестного типа

https://play.golang.org/p/OWxX1kPJ6Qa

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
    "reflect"
)


func encode1() []byte {

    x := "123"

    buf := &bytes.Buffer{}
    enc := gob.NewEncoder(buf)
    err := enc.Encode(x)
    if err != nil {
        panic(err)
    }
    return buf.Bytes()

}

func decode1(b1 []byte) {
    var x string
    dec := gob.NewDecoder(bytes.NewBuffer(b1))
    err := dec.Decode(&x)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%#v\n", x)
}

func decode2(b1 []byte) {
//  var x reflect.Value
    x := reflect.New(reflect.TypeOf(""))
    dec := gob.NewDecoder(bytes.NewBuffer(b1))
    err := dec.DecodeValue(x)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%#v\n", x)
    fmt.Printf("%#v\n", reflect.Indirect(x))
}

func main() {
    b1 := encode1()
    decode1(b1)
    decode2(b1)
}

1 ответ

Вам необходимо зарегистрировать свой тип, прежде чем кодировать декодирование

Регистр записывает тип, идентифицируемый значением для этого типа, под своим внутренним именем типа. Это имя будет идентифицировать конкретный тип значения, отправляемого или получаемого в качестве переменной интерфейса. Только типы, которые будут переданы как реализации значений интерфейса, должны быть зарегистрированы. Ожидается, что будет использоваться только во время инициализации, он паникует, если отображение между типами и именами не является биекцией.

Другие вопросы по тегам