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

map - How do you pass TCP connection objects to other Go modules?

I have a map of hostnames to connections that I am trying to pass around to different modules for an application that I am writing in Go.

In the main server.go file, I dial the other servers in my network and save the connections to this map:

Then I want to send this map to other modules to re-use the connections. Here is an example for how I send it to the learner module:

In the learner module I take the map and start trying to use a gob.Decoder on each connection that it contains:

And within the listen function:

The problem is that when I call decoder.Decode(proposal) here, a panic happens:

I use this same encode/decode code elsewhere without problems, and the only difference is that I'm trying to re-use a connection instead of calling decode immediately after establishing a new one within the same function. I've been trying to make this work for hours, trying to pass things by reference, using map[string]interface{}, and all sorts of things without luck. Gob.decode should block until something is encoded on the underlying net.Conn object, right? I can only guess that the net.Conn object has gotten invalidated somehow by this point.

Am I doing something wrong with how I am passing around connection objects? I read that a net.Conn was a very simple object that was fine to pass by value, but I must be missing something. When attempting to pass it by reference using type interface{}, I got errors like:

I'm at a loss now, trying to figure out what could be wrong with the connection objects, if I'm misusing gob.Decode, there's an issue with putting net.Conn objects into maps, or if the problem is something completely different.

Any ideas?

edit: The full panic traceback is below:

Update: The problem was found! I didn't realize that you could just fmt.Println(conn) to get more information out of it, and discovered that the conn was nil, and that caused the panic. Sorry for the trouble, and thanks for your help.

0 投票
2 回答
1643 浏览

json - 在匹配 Go 中的基础类型时将 JSON 解组为接口变量

我正在编写一个包装器来映射我需要的一些附加功能。一些最重要的事情是在保持通用性的同时编组和解组数据的能力。我设法使用 encoding/gob 编码器编写了一个编组器,但是如果编组的数据是人类可读的会很好,我决定用 JSON 编写另一个实现。

我通过使用 Register() 将实现对象实例传递给 gob 来巧妙地从通用接口变量进行编码和解码。(这个资源帮助我了解了细节!http://www.funcmain.com/gob_encoding_an_interface

但是,JSON 没有 Register()。假设我们有一个类型的值

在类型变量中

当我编组它时,它会像这样输出 JSON:

当我尝试再次将其解组为 genericValue 类型的变量时,它说:

恐慌:接口转换:map[string]interface {} 不是 genericValue:缺少方法键编辑:糟糕,实际上它是这样说的!

很明显,它试图像这里所说的那样编组数据:http: //blog.golang.org/json-and-go(参见“带有接口的通用 JSON{}”)

我怎样才能让它尝试将数据适合特定的实现,例如如果实现是 Register()ed,gob 解码器会尝试?Register() 是天赐之物,它允许编组和解组,就像它什么都不是一样。如何让 JSON 做同样的事情?

0 投票
1 回答
398 浏览

go - 在流处理中使用 Gob 的示例

在处理内部重复的数据结构(如大片结构或记录的流数据)时,Gob 在空间和性能效率方面表现出色。但是,经过一番搜索,我找不到直接的例子。

任何人都可以提供或链接到如何在(可能是无限的)流式输入中使用的示例吗?(就像从队列中读取的工作人员)

0 投票
2 回答
3015 浏览

go - Golang goroutines 共享 RPC 连接

我有一个 Golang 服务器,它使用专用的 goroutine 服务入站请求。这些 goroutine 将使用 rpc/gob 访问另一个后端 go 服务器。如果重用连接以使 Gob 更好地工作(请求共享连接可以重用元数据而不重新发送,也可以节省 TCP 启动的时间),我正在考虑实现连接池类似的机制(如 mysql 客户端池),但在此之前我错过了什么重要的事情吗?

任何 Go 特定的方式来处理这种共享 RPC 客户端?或者有什么项目可以处理这种情况?

0 投票
3 回答
44303 浏览

sockets - 在 Go 中写入客户端 UDP 套接字

我正在为使用 Go 语言的 UDP 套接字进行客户端/服务器通信寻找一个好的解决方案。

我在 Internet 上找到的示例向我展示了如何将数据发送到服务器,但它们没有教如何将它们发送回客户端。

为了演示,我的程序执行以下操作:

我的客户端程序在 4444 端口上创建一个套接字,如下所示:

我向服务器发送了一个字符串和本地地址,因此它可以打印该字符串并发送一条 OK 消息。我为此使用gob:

我的数据结构如下所示:

我的服务器侦听 4444 端口并正确解码 Gob,但是如何将 OK 消息发送回来?我正在使用客户端地址来执行此操作(在服务器 .go 文件上):

然后,我得到一个错误代码:

当客户端尝试连接到服务器的 4444 端口时,客户端会创建一个带有随机数(在本例中为 35290)的端口,以便它们可以通信。我知道我不应该将客户端的地址传递给服务器,但是 conn.RemoteAddress() 不起作用。发现客户地址的解决方案将不胜感激。

Obs.:我知道有 ReadFromUDP,所以我可以读取包。我应该阅读它,发现客户的地址,然后将数据发送到 Gob 以便它可以解码吗?

0 投票
1 回答
1501 浏览

go - 在 Go 中对 Gob 数据使用 Snappy 压缩?

我需要将结构保存到磁盘并稍后再次读取它,我试图将 IO 降低到最低限度,但也不花费时间压缩和解压缩文件,所以我打算使用 Snappy 进行压缩,因为它非常快并且相对有效。

通常我会在将 gob 保存到文件时对其进行 gzip 压缩,如下所示:

但是 Snappy 并没有附加到其他所有东西似乎都在使用的这些 Reader/Writer 接口。相反,它只提供基本功能: https ://godoc.org/code.google.com/p/snappy-go/snappy

func Encode(dst, src []byte) ([]byte, error)

func Decode(dst, src []byte) ([]byte, error)

使用这个 Snappy 包压缩 Gob 数据的最有效方法是什么?理想情况下,我不想使用 ioutil.ReadAll 从 gob 读取器中读取一个字节,然后重新压缩,因为这似乎是一种非常繁重的方式,会浪费大量内存.

我承认我并不完全理解阅读器和编写器接口是如何工作的。

0 投票
1 回答
627 浏览

go - 使用 gob 封装递归定义的结构体

我主要使用 Python,但正在玩 Go。我编写了以下代码来做一些在 python 中非常简单的事情,我希望它也可以在 Go 中完成。

如您所见,有两个自定义结构,每个都包含对另一个的引用,递归。当我尝试使用 gob 将一个打包到一个文件中时,它会编译,但我得到一个堆栈溢出,我假设这是由递归引起的。根据我的经验,pickle 可以毫不费力地处理这样的事情。我究竟做错了什么?

0 投票
1 回答
1418 浏览

encoding - 如何编码/解码空字符串

我正在为我的项目使用 GOB 编码,我发现(经过长时间的斗争)空字符串没有正确编码/解码。在我的代码中,我使用错误消息(字符串)来报告任何问题,这个错误消息大部分时间都是空的。如果我编码一个空字符串,它就什么都没有了,这给我解码带来了问题。我不想更改编码/解码,因为这些部分使用得最多。我如何告诉 Go 如何编码/解码空字符串?

示例: 游乐场工作代码。 操场不工作的代码。

0 投票
1 回答
63 浏览

go - En/Decode 结构包含许多具有不同实现的接口,每个接口都有 gob

我有一个非常复杂的结构,其中包含许多具有不同实现的接口。为了在 gob 中编码/解码该结构,我似乎必须注册每个可能用于每个接口的实现。所以我最终得到了一种方法:

我需要在编码/解码之前调用它。有没有更简单的方法来做到这一点?或者我应该研究生成这种方法的可能性,因为跟踪所有可能的实现非常乏味?

0 投票
1 回答
1164 浏览

go - 有没有办法用编码/gob 序列化循环数据结构?

我正在将神经网络库移植到 Go。我希望能够保存和恢复一个训练有素的网络,所以我试图直接序列化它。问题是,网络结构在其字段中包含循环(神经元 A 与神经元 B 有连接,神经元 B 与神经元 A 有连接)。每当我尝试使用 encoding/gob 序列化整个网络时,它都会因堆栈溢出而失败。

这是一个以相同方式中断的非常简单的代码示例:

http://play.golang.org/p/LrO0VlLnX4

除非重写库的整个结构以避免循环,有没有直接的方法来解决这个问题?

谢谢