我目前正在将一个struct保存到文件中,以便可以加载它,然后通过实现gob来使用,如下所示:
func (t *Object) Load(filename string) error {
fi, err := os.Open(filename)
if err !=nil {
return err
}
defer fi.Close()
fz, err := gzip.NewReader(fi)
if err !=nil {
return err
}
defer fz.Close()
decoder := gob.NewDecoder(fz)
err = decoder.Decode(&t)
if err !=nil {
return err
}
return nil
}
func (t *Object) Save(filename string) error {
fi, err := os.Create(filename)
if err !=nil {
return err
}
defer fi.Close()
fz := gzip.NewWriter(fi)
defer fz.Close()
encoder := gob.NewEncoder(fz)
err = encoder.Encode(t)
if err !=nil {
return err
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
我担心的是Go可能会以一种改变数据gobs编码和解码方式的方式进行更新.如果发生这种情况,那么使用新版Go编译的应用程序版本将无法加载从以前版本保存的文件.这将是一个重大问题,但我不确定它是否是一个现实的关注.
那么有人知道我是否可以认为保存和加载像这样的gob编码数据是安全的,并期望它在Go更新时仍能正常工作?
如果没有,最好的选择是什么?将我的功能还是工作,如果我改变gob.NewDecoder,并gob.NewEncoder以xml.NewDecoder和xml.NewEncoder?(XML编码器是否以与gob相同的方式编码和解码结构,即我不必告诉它它们的样子?)
在该类型GobEncoder文件确实提到:
注意:由于gob可以永久存储,因此
GobEncoder在软件发展过程中保证a使用的编码稳定是一个很好的设计.
例如,GobEncode在编码中包含版本号可能是有意义的.
但这适用于自定义编码器.
对于随go提供的那个,在源级别上保证兼容性:不会对任何Go 1点版本进行向后不兼容的更改.
这应该意味着gob应该像现在一样继续工作.
对于像" ugorji/go/codec " 这样的项目,存在一种不同且强大的解决方案:
高性能和功能丰富的惯用Go库,为不同的序列化格式提供编码/解码支持.
支持的序列化格式为:
msgpack:https://github.com/msgpack/msgpackbinc:http://github.com/ugorji/binc
但除非你需要那些特定的格式,否则gob就足够了.