反序列化未知 Go 的 gob blob

use*_*782 5 reflection serialization go gob reflect

我有一些未知类型的东西。有办法打印出来看里面吗?

可能有gob.Debug,但对我来说不可用 https://golang.org/src/encoding/gob/debug.go

谷歌搜索建议使用,DecodeValue但它需要初始化reflect.Value 如果我得到未知的gob 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)
}
Run Code Online (Sandbox Code Playgroud)

Cal*_*oki 0

您需要在编码解码之前注册您的类型

Register 在其内部类型名称下记录一个类型,由该类型的值标识。该名称将标识作为接口变量发送或接收的值的具体类型。仅需要注册将作为接口值的实现进行传输的类型。预计仅在初始化期间使用,如果类型和名称之间的映射不是双射,则会出现恐慌。