问题标签 [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 回答
1763 浏览

go - Golang TCPConn Gob 通信

我遇到了 gob 协议的问题(或者可能是一般的网络,我的知识很薄弱),我不明白为什么下面的代码不能正常工作。它只是一个维护开放 TCP 连接并通过它发送多个 gob 的简单示例。该代码将发送和接收,但通常会破坏其数据。先感谢您。

0 投票
1 回答
413 浏览

asynchronous - 如何有效地解码 gobs 并等待更多通过 tcp 连接到达

我想要一个用于游戏应用程序的 TCP 连接。有时间效率很重要。我想有效地接收许多对象。由于负载,CPU 效率也很重要。

到目前为止,我可以确保每次使用 go 的网络库拨打连接时都会调用 handleConnection。但是,一旦创建了连接,我就必须轮询(一遍又一遍地检查连接上是否准备好新数据)。这似乎效率低下。如果它不必要地占用 CPU,我不想运行该检查以查看新数据是否已准备好。

我一直在寻找诸如以下两个选项之类的东西,但没有找到我想要的东西。

(1) 执行以某种方式阻塞(不占用 CPU)的读取操作,然后在连接流上准备好新内容时解除阻塞。我找不到那个。

(2) 采用异步方法,当新数据到达连接流时调用函数(不仅仅是在拨打新连接时)。我找不到那个。

我不想在这里打任何睡眠电话,因为这会增加响应单身消息的延迟。

我也考虑过拨出每条消息,但我不确定这是否有效。

所以我想出了下面的代码,但它仍在使用 Decode(p) 调用检查新数据,这似乎不是最优的。

我怎样才能更有效地做到这一点?

0 投票
2 回答
2268 浏览

go - 尝试在 golang 中解码 gob 时出现“缓冲区中的额外数据”错误

我正在对流中的多个对象进行编码和发送。我将它们解码,如下面的代码所示,保持连接打开。我在第一个之后解码所有对象时收到“缓冲区中的额外数据”错误。

0 投票
2 回答
850 浏览

pointers - 在golang中具有指向0值的深度复制结构

我有一个结构golang如下

prop当指针指向零值时,我想对结构对象进行深度复制。真正的结构中有更多的字段,我想要整个结构 obj 的深度复制。我尝试使用gob编码解码方式,但由于此处提到的设计结果,它将指针转换为 0 到零指针。我也尝试使用reflect.Copy,但它因错误而恐慌panic: reflect: call of reflect.Copy on struct Value。有没有更好的方法来深度复制这样的结构对象?

编辑:我尝试使用json编码/解码,它有点工作。但我不知道它的缺点。

对此解决方案有何评论?

0 投票
0 回答
450 浏览

go - 有没有 Gob MIME 类型?

是否有任何(非)官方的 Gob MIME 类型,例如application/x-gob?官方文档从未提及任何 MIME 类型。

我不确定我是否应该使用与 Protobuf 相同的方法,后者停止使用特定类型以支持泛型application/octet-stream(请参阅Protobuffer 使用八位字节流作为其默认内容类型

0 投票
1 回答
1819 浏览

go - Gob 解码给出“无法赋值的解码值”错误

我对 Go 很陌生,我在把 gob 放在电线上时遇到了一些麻烦。我写了一个我认为会通过的快速测试,但解码调用返回“DecodeValue of unassignable value”错误。这是代码:

我怀疑我在这里遗漏了一些愚蠢的东西,并感谢您能够提供的任何帮助。

0 投票
1 回答
33787 浏览

json - 在 golang、JSON 与 gob 中深度复制对象的更快方法

我正在使用go 1.9. 我想将对象的值深度复制到另一个对象中。我尝试使用 encoding/gob 和 encoding/json 来做到这一点。但是gob编码比json编码需要更多的时间。我看到其他一些类似的问题他们建议 gob 编码应该更快。但我看到完全相反的行为。有人可以告诉我我做错了什么吗?还是有比这两种更好更快的深度复制方法?我的对象结构复杂且嵌套。

测试代码:

我得到以下输出:

0 投票
1 回答
1681 浏览

go - 在不知道具体类型的情况下解码 gob 输出

我正在使用 gob 将结构序列化到磁盘。有问题的结构包含一个接口字段,因此需要使用 注册具体类型gob.Register(...)

这里的问题是,进行 gob-ing 的库应该不知道所使用的具体类型。即使调用者定义了自己的接口实现,我也希望序列化成为可能。

我可以通过动态注册类型来成功编码数据(参见下面的简单示例),但是在尝试重新读取该数据时,gob 拒绝接受未注册的类型。令人沮丧,因为感觉所有数据都在那里 -main.UpperCaseTransformation如果它被标记为这样,为什么 gob 不将其解压缩为结构?

我的解决方法是要求接口的实现者向 gob 注册他们的类型。但我不喜欢这如何向调用者揭示我的序列化选择。

有没有避免这种情况的前进路线?

0 投票
2 回答
2778 浏览

go - 在golang中散列多个值

我目前正在开发一个需要缓存不同资源的应用程序。不同类型的资源具有处理程序,这些处理程序将知道哪些数据与确定相关,我们是否必须重建资源或是否可以从缓存中获取它。为此,处理程序应生成所有相关数据的哈希以进行缓存。根据上下文,数据可以是基元(int、float、...)、字符串、切片、结构和映射。所以几乎所有的东西。用于散列的对象数量也可能有所不同。

为了在处理程序中计算该哈希,我创建了一个带有 type 可变参数的哈希函数interface{}

我目前的做法是这样的:

这行得通。但是有一些事情让我对这个实现感到头疼。因为我不确定gob 总是表现出确定性,对于当前版本似乎是这种情况,但正如引用的答案指出的那样,版本之间可能会有变化。根据 gob 的文档,传输结构时将省略默认值(0 表示整数,空字符串,nil,...)。此外,所有 int 值都将作为通用数字传输。所以 unit64 和 int 将是相同的。对于我的用例,我想不出一个实际的问题,但这闻起来像是麻烦的根源。

现在,如果我从头开始编写该函数,我会正确地使用它,用反射遍历结构并创建一个散列树。但我不想那样做。

我很确定我不是第一个有这些要求的人,但是我无法在网络上找到任何经过良好测试的 go 代码来解决这个问题。

附录

另请参阅:https ://crypto.stackexchange.com/questions/10058/how-to-hash-a-list-of-multiple-items

这并不像看起来那么简单。正如 Adrian 指出的那样简单地连接数据是行不通的,因为那时Hash("12", "3")Hash("123")将生成相同的哈希。一种可能的解决方案是在散列之前添加数据长度(和列表元素的数量)或创建散列树,但我想不出一种可靠的方法来处理复杂数据结构中的任何一个,没有编写大量反射代码来处理所有不同的情况(整数、浮点数、字符串、结构、切片等)并遍历整个结构。我想避免这种情况,因为这样做可以监督很多特殊情况,这对我来说似乎没有必要复杂。这就是我尝试使用序列化解决问题的原因,它将解决上述大部分问题。我只是不确定在这种情况下使用 gob 是否有一些缺点,以及是否没有更智能的解决方案。

0 投票
0 回答
442 浏览

go - 使用 golang RPC 时出错:坏数据:未定义类型 arrayType

我正在尝试使用 golang RPC 调用来传递结构,但在发送结构时出现错误。

目前,每当我使用 Ipv6 参数传递 CNI 结构结果时,都会收到以下错误:

gob:坏数据:未定义类型 arrayType = strcut { CommonType CommonType = struct { 名称字符串;身份证; }; 元素 int; 整数;}

但是,每当我通过 IPv4 结构时,我永远不会收到该错误。

可能是什么原因?

请让我知道你们是否需要更多信息。

我的结构如下所示:

Result 结构的 CNI 导入:

我的结果如下:

{ [{Name:eth0 Mac:92:26:b0:72:da:85 Sandbox:/proc/20314/ns/net}] [{Version:6 接口:0xc42061be70 地址:{IP:2002:2:1: 1::53 掩码:ffffffffffffffff0000000000000000} 网关:2002:2:1:1::1}] [{Dst:{IP::: 掩码:00000000000000000000000000000000} GW:2002:2:1:1::1}] { [] [] []}}

我打电话给