编码目标确定吗?

编码目标确定吗?,第1张

编码/目标确定吗?

只要它“完成工作”,您就不需要真正关心。但是当前的

encoding/gob
实现是确定性的。但是(继续阅读)!

以来:

一滴滴水是自我描述的。流中的每个数据项之前都有其类型的规范,以一小套预定义类型表示。

这意味着如果您第一次编码类型的值,则将发送类型信息。如果您对另一个相同类型的值进行编码,则不会再次传输类型描述,而仅是对其先前规范的引用。因此,即使您对相同的值进行两次编码,也会产生不同的字节序列,因为第一个包含类型spec和值,第二个仅包含类型ref(例如,类型id)和值。

请参阅以下示例:

type Int struct{ X int }b := &bytes.Buffer{}e := gob.NewEnprer(b)e.Enpre(Int{1})fmt.Println(b.Bytes())e.Enpre(Int{1})fmt.Println(b.Bytes())e.Enpre(Int{1})fmt.Println(b.Bytes())

输出(在Go Playground上尝试):

[23 255 129 3 1 1 3 73 110 116 1 255 130 0 1 1 1 1 88 1 4 0 0 0 5 255 130 1 2 0][23 255 129 3 1 1 3 73 110 116 1 255 130 0 1 1 1 1 88 1 4 0 0 0 5 255 130 1 2 0 5 255 130 1 2 0][23 255 129 3 1 1 3 73 110 116 1 255 130 0 1 1 1 1 88 1 4 0 0 0 5 255 130 1 2 0 5 255 130 1 2 0 5 255 130 1 2 0]

如图所示,第一个调用会

Enpre()
生成大量字节,再加上我们的
Int
[5 255 130 1 2 0]
,第二个和第三个调用会添加相同的
[5255 130 1 2 0]
序列。

但是,如果创建2个不同的

gob.Enprer
s,并且以相同的顺序写入相同的值,则它们将产生精确的结果。

注意,在前面的语句中“相同的顺序”也很重要。因为类型规范是在发送该类型的第一个值时发送的,所以以不同顺序发送不同类型的值也会以不同顺序发送类型规范,因此类型的引用/标识符可能会有所不同,这意味着当此类类型已编码,将使用/发送不同的类型引用/
id。

还要注意,该

gob
软件包的实现可能因发行版本而异。这些更改将向后兼容(如果出于某种原因它们将进行向后不兼容的更改,则必须明确声明),但是向后兼容并不意味着输出是相同的。因此,不同的Go版本可能会产生不同的结果(但是所有兼容版本都可以解码)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5028694.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存