Десериализация неизвестного сгустка Го - PullRequest
0 голосов
/ 25 ноября 2018

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

Может быть 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 Ответ

0 голосов
/ 25 ноября 2018

вам необходимо зарегистрировать ваш тип перед кодированием декодирования

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

...