我正在做一个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: encoded unsigned integer out of range(编码无符号整数超出范围)
我认为问题出在解码程序的前两行。那么我应该放什么才能正确解码gob呢?
EDIT:我想要的是gobString的.UnString()方法。我怎样才能实现呢?
该 encoding/gob
从围棋值生成二进制数据。其结果不是用于文本表示,所以你不应该把它当作一个 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)
輸出 (試試看) 去游乐场):
Hello, 世界
还需要注意的是,如果你想把编码后的数据写入网络连接或文件中,你就不需要... bytes.Buffer
你可以直接编码到这些。如果你必须使用 bytes.Buffer
,您也可以使用它的 Buffer.WriteTo()
方法,将其内容写入一个 io.Writer
(如文件或网络连接)。