Go:使用gob包将数据保存到文件以供以后使用是否安全?

时间:2014-07-26 04:17:40

标签: go

我目前正在将一个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
}

我担心的是,Go可能会以改变数据gobs编码和解码方式的方式进行更新。如果发生这种情况,那么使用新版Go编译的应用程序版本将无法加载从以前版本保存的文件。这将是一个主要问题,但我不确定它是否是一个现实的关注。

所以有人知道我是否可以认为保存和加载这样的gob编码数据是安全的,并且期望它在Go更新时仍能正常工作?

如果没有,最好的选择是什么?如果我将gob.NewDecodergob.NewEncoder更改为xml.NewDecoderxml.NewEncoder,我的功能是否仍然有效? (XML编码器是否以与gob相同的方式编码和解码结构,即我不必告诉它它们的样子?)

1 个答案:

答案 0 :(得分:6)

documentation for the type GobEncoder确实提到了:

  

注意:由于gob可以永久存储,因此保证GobEncoder使用的编码在软件发展过程中保持稳定是一个很好的设计。
  例如,GobEncode在编码中包含版本号可能是有意义的。

但这适用于自定义编码器。

对于随go提供的内容,compatibility is guarantee at source level:不会向任何Go 1点发布版本进行向后不兼容的更改。

这应该意味着gob应该像现在一样继续工作。

ugorji/go/codec”等项目存在一个不同且强大的解决方案:

  

高性能和功能丰富的惯用Go库,为不同的序列化格式提供编码/解码支持。

     

支持的序列化格式为:

     

但除非你需要那些特定的格式,否则gob就足够了。