gpt4 book ai didi

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

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

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

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

package main

import (
"bytes"
"encoding/gob"
"fmt"
"log"
)

type P struct {
Name string
Q *Q
}

type Q struct {
Name string
P *P
}

func main() {
var network bytes.Buffer // Stand-in for a network connection
enc := gob.NewEncoder(&network) // Will write to network.
dec := gob.NewDecoder(&network) // Will read from network.

p := &P{ "P", nil }
q := &Q{ "Q", p }
p.Q = q

err := enc.Encode(p)
if err != nil {
log.Fatal("encode error:", err)
}
// Decode (receive) the value.
var p2 *P
err = dec.Decode(&p2)
if err != nil {
log.Fatal("decode error:", err)
}
fmt.Printf("%#v", p2)
}

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

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

谢谢

最佳答案

不能直接使用gob,但勇敢的世界公民不要害怕!

您可以实现 BinaryMarshaler/BinaryUnmarshaler作为变通方法在您的类型上添加接口(interface),gob 会在编码/解码您的类型时愉快地使用它们。

func (p *P) MarshalBinary() (_ []byte, err error) {
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
enc.Encode(p.Name)
if p.Q == nil {
return buf.Bytes(), nil
}
isCyclic := p.Q != nil && p.Q.P == p
enc.Encode(isCyclic)
if isCyclic {
p.Q.P = nil
err = enc.Encode(p.Q)
p.Q.P = p
} else {
err = enc.Encode(p.Q)
}
//buf.Encode
return buf.Bytes(), err
}

func (p *P) UnmarshalBinary(data []byte) (err error) {
dec := gob.NewDecoder(bytes.NewReader(data))
if err = dec.Decode(&p.Name); err != nil {
return
}
var isCyclic bool
if err = dec.Decode(&isCyclic); err != nil {
return
}
err = dec.Decode(&p.Q)
if isCyclic {
p.Q.P = p
}
return
}

playground

警告 每次都创建一个新的解码器/编码器效率极低,您可能需要考虑使用 binary.* .

关于go - 有没有办法用encoding/gob序列化循环数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28665403/

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