3

我正在制作一个 go 程序,我需要将 gob 写入文件。我使用 .String() 方法将 gob 转换为字符串。

var network bytes.Buffer
encoder := gob.NewEncoder(&network)

_ = encoder.Encode(valueToEncode)

gobString := network.String()

然后我将 gob 写入一个文件,稍后我将检索它并将其发送到这个程序:

var filebytes = []byte(file)  //i think that these two lines are the issue
network := bytes.NewBuffer(filebytes)

decoder := gob.NewDecoder(network)

var decoded interface{}

_ := decoder.Decode(&decoded)

但是当我运行它时,它给了我这个错误:

gob:编码的无符号整数超出范围

我认为问题在于解码器程序的前两行。那么我应该放什么来正确解码gob?

编辑:我想要的是 gobString 的 .UnString() 方法。我怎样才能做到这一点?

4

1 回答 1

2

encoding/gobGo 值生成二进制数据。结果不适用于文本表示,因此您不应将其视为string,而应将其视为一系列字节,例如[]byte.

也就是说,如果您必须获取编码数据Buffer.String(),请不要使用。Buffer.Bytes()

string这是一个使用 对值进行编码和解码的示例encoding/gob

// ENCODE
var network bytes.Buffer
encoder := gob.NewEncoder(&network)

valueToEncode := "Hello, 世界"
if err := encoder.Encode(valueToEncode); err != nil {
    panic(err)
}

gobData := network.Bytes() // Save / serialize this byte slice

// DECODE
network2 := bytes.NewBuffer(gobData)
decoder := gob.NewDecoder(network2)

var decoded string
if err := decoder.Decode(&decoded); err != nil {
    panic(err)
}
fmt.PrintTln(decoded)

输出(在Go Playground上试试):

Hello, 世界

另请注意,如果您打算将编码数据写入网络连接或文件,则不需要bytes.Buffer,您可以直接对其进行编码。如果必须使用bytes.Buffer,也可以使用它的Buffer.WriteTo()方法将其内容写入一个io.Writer(如文件或网络连接)。

于 2020-05-06T17:50:59.393 回答