问题标签 [gob]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
42 浏览

go - gob not decoding as expected

Here is my playground where I am trying to serialize a list of structures and read back from the file.

https://play.golang.org/p/8x0uciOd1Sq

I was expecting the object to be decoded successfully. What am I doing wrong?

0 投票
1 回答
1408 浏览

go - 将嵌套结构保存到 gob

我正在尝试将结构保存到 gob,但该文件缺少嵌套类型的值。我可以自己保存 Matrix 类型,但 Network 结构的 gob 数据不包括 Matrix 值。有没有办法将这个嵌套结构保存到 gob 或者我必须拆分它?

谢谢!

0 投票
1 回答
1062 浏览

arrays - 接受任意大小数组作为参数的函数(在 Golang 中可能吗?)

问:有没有办法在 golang 中定义一个接受任意长度数组作为参数的函数?

例如,

我知道在golang中,数组长度是变量类型的一部分,因此以下函数不会接受一个任意数组作为输入

此函数不会arrInput [6]int作为输入进行编译——即,demoArray(arrInput)将无法编译。

此外,接受切片参数的以下函数不接受数组作为参数(不同类型,如预期的那样):

即,demoSlice(arrInput)不编译,期望切片而不是数组。

问题是,有没有办法定义一个接受任意长度数组(数组,不是切片)的函数?一种语言强加这种约束看起来很奇怪和限制。

这个问题的意义与动机无关,但就我而言,背后的原因如下。我有一组函数,它们将类型的数据结构作为参数[][]int。我注意到它们的 GOB 序列化比我拥有的其他数据结构慢 10 倍 (MB/s)。我想这可能与切片中的取消引用操作链有关。从切片到数组——即定义类型的对象——[10000][128]int可能会改善情况(我希望如此)。

问候

Ps:我现在提醒一下,Go,“按值”传递/使用事物,使用数组可能是矫枉过正,因为 golang 会复制它们很多次。我想我会继续使用切片,我会尝试稍微了解 GOB 的内部结构。

0 投票
2 回答
1840 浏览

go - 如何告诉 Golang Gob 编码可以序列化包含没有导出字段的结构的结构

我相信这是 Gob 序列化的合法用例。但是由于没有导出字段而enc.Encode返回错误。Something请注意,我不是Something直接序列化,而是仅Composed包含导出的字段。

我发现的唯一解决方法是将Dummy(导出的)值添加到Something. 这很丑陋。有没有更优雅的解决方案?

https://play.golang.org/p/0pL6BfBb78m

0 投票
1 回答
1135 浏览

go - gob:类型未注册接口:[]interface {}

我正在尝试将地图复制到另一张地图,所以我使用 gob 来执行此操作。但是,当我将 json 解组为 map[string]interface{} 然后尝试将其复制到另一个地图时,我在编码部分出现错误。

这是代码:

我收到一个错误:gob:类型未注册接口:[]interface {}

如何避免这种情况?

0 投票
0 回答
147 浏览

go - 如何计算通过 gob.Encode 写入的每条记录的哈希值

我的目标是创建类似 WAL-log 的东西,并确保数据一致,我使用了一些散列。

对于每个编码记录,我都有以下代码计算哈希:

它产生以下输出:

那么为什么当我按顺序解码条目时哈希值是相同的呢?如何实现此输出:

0 投票
1 回答
2576 浏览

go - Go 错误:gob:类型 sync.Mutex 没有导出字段

我遇到了一个问题,如果它有一个导出的sync.Mutex. 如果我使互斥锁未导出(通过不将其大写),一切似乎都有效。我很想知道为什么会这样,并确保吞噬 unexported 没有其他问题sync.Mutex

我看到谷歌上有几个与 相关的问题sync.RWMutex,但没有一个真正解释为什么会发生这种情况。

输出:

错误:gob:类型 sync.Mutex 没有导出字段

0 投票
1 回答
268 浏览

go - 将 map 序列化为 gob 后 DeepEqual 不正确

我在 reflect.DeepEqual 中遇到了一些奇怪的行为。我有一个 type 的对象map[string][]string,其中一个键的值是一个空切片。当我使用 gob 对该对象进行编码,然后将其解码为另一个映射时,根据 reflect.DeepEqual,这两个映射不相等(即使内容相同)。

输出:

后续实验的几点说明:

如果我创建m0["apple"]一个非空切片的值,例如m0["apple"] = []string{"pear"},则 DeepEqual 返回 true。

如果我将值保留为空切片,但我从头开始而不是使用 gob 构建相同的映射,则 DeepEqual 返回 true:

因此,DeepEqual 如何处理空切片并不是严格意义上的问题。这是和 gob 的序列化之间的一些奇怪的交互。

0 投票
1 回答
1118 浏览

pointers - Gob 无法使用 nil 指针值对地图进行编码

如果其中一个值为 nil,当我尝试将映射编码为指针时,Gob 的编码返回错误。这似乎与文档相矛盾(但我可能误解了意思):

在切片和数组以及映射中,所有元素,甚至是零值元素,都会被传输,即使所有元素都为零。

代码:

输出:

在这种情况下,gob 是否有充分的理由失败?似乎这两个明显的选项中的任何一个都比失败更可取:1)不要对任何具有零值值的键进行编码,或者 2)即使值是零值,也要对所有键进行编码。就目前的情况而言,递归扫描我的结构以查看是否有任何 nil 映射值,如果有则删除这些键的最佳做法是什么?如果需要此检查,似乎应该是 encoding/gob 包的责任,而不是用户。

此外,规则不仅仅是“gob 不能对键值为 nil 的映射进行编码”,因为如果值类型是切片,则接受 nil:

0 投票
0 回答
74 浏览

go - 当使用 gob 通过网络对结构进行序列化时,为什么我们需要 Register() 任何作为传输结构内部接口的字段?

如果我们要发送

gob 要求我们注册隐藏在我们的 interface{} 后面的具体类型。为什么 gob 不能使用反射来单独识别字段中的底层具体类。

也就是我们需要使用Register方法告诉gob具体的类型是什么。

鉴于方法签名看起来像这样Register(value interface{}),gob 已经使用反射来完全识别传递给方法的类型。

为什么 gob 不在运行时遍历实例化的 ABC 结构并自动执行 Register?