反序列化未知Go的gob斑点

时间:2018-11-25 13:05:11

标签: go serialization reflection gob reflect

我有不明类型的小滴。有没有办法打印它以便在内部查看?

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

使用DecodeValue的Google搜索建议,但需要初始化reflect.Value 如果我得到未知的料滴,那么我将无法通过未知类型传递初始化值

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 :(得分:1)

在编码解码之前,您需要Register类型

  

寄存器在下面记录一种类型,由该类型的值标识   其内部类型名称。该名称将标识   作为接口变量发送或接收的值。只有会   由于需要实现接口值的实现而被转移   注册。预期仅在初始化期间使用,它会慌乱   如果类型和名称之间的映射不是双射。