gpt4 book ai didi

Go:使用gob包将数据保存到文件以备后用安全吗?

转载 作者:IT王子 更新时间:2023-10-29 01:26:44 26 4
gpt4 key购买 nike

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

所以有谁知道我是否可以认为像这样保存和加载 gob 编码数据是安全的,并期望它在 Go 更新时仍然有效?

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

最佳答案

documentation for the type GobEncoder确实提到:

Note: Since gobs can be stored permanently, It is good design to guarantee the encoding used by a GobEncoder is stable as the software evolves.
For instance, it might make sense for GobEncode to include a version number in the encoding.

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

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

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

像“ugorji/go/codec ”这样的项目存在一个不同而强大的解决方案:

High Performance and Feature-Rich Idiomatic Go Library providing encode/decode support for different serialization formats.

Supported Serialization formats are:

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

关于Go:使用gob包将数据保存到文件以备后用安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24967477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com