我目前正在将一个结构保存到文件中,以便可以加载它,并稍后通过实现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的更新方式可能会更改数据块编码和解码的方式。如果发生这种情况,则使用新版Go编译的我的应用程序版本将无法加载从先前版本保存的文件。这将是一个主要问题,但是我不确定这是否是现实的问题。

那么,有谁知道我是否可以认为这样安全地保存和加载gob编码数据,并希望它在Go更新后仍能正常工作?

如果没有,最好的选择是什么?如果我将gob.NewDecodergob.NewEncoder更改为xml.NewDecoderxml.NewEncoder,我的功能仍然可以使用吗? (XML编码器是否以与gob相同的方式对结构进行编码和解码,即无需我告诉它们它们的外观?)

最佳答案

documentation for the type GobEncoder确实提到:

但这适用于自定义编码器。
对于go随附的版本,compatibility is guarantee at source level:向后不兼容的更改将不会对任何Go 1 point版本进行。
那应该意味着采空区应该像现在一样继续工作。
像“ugorji/go/codec”这样的项目存在一个不同而强大的解决方案:

但是除非您需要这些特定格式,否则gob应该足够了。

09-17 13:28