Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法用encoding/gob序列化循环数据结构?_Go_Cyclic Reference_Gob - Fatal编程技术网

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

有没有办法用encoding/gob序列化循环数据结构?,go,cyclic-reference,gob,Go,Cyclic Reference,Gob,我正在准备移植一个神经网络库。我希望能够保存和恢复一个经过训练的网络,所以我尝试直接序列化它。问题是,网络结构在其域中包含循环(神经元A与神经元B连接,后者与神经元A连接)。每当我尝试用encoding/gob序列化整个网络时,它都会失败,并导致堆栈溢出 下面是一个非常简单的代码示例,它以相同的方式中断: package main import ( "bytes" "encoding/gob" "fmt" "log" ) type P struct {

我正在准备移植一个神经网络库。我希望能够保存和恢复一个经过训练的网络,所以我尝试直接序列化它。问题是,网络结构在其域中包含循环(神经元A与神经元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)
}

除非重写库的整个结构以避免循环,否则有没有一种简单的方法来解决这个问题


谢谢

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

您可以在您的类型上实现/接口作为一种变通方法,而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
}


警告每次创建一个新的解码器/编码器效率极低,您可能需要研究使用。

的可能重复看起来像重复。没有找到那个问题,因为我在搜索循环问题,而不是递归问题。我知道,这是一个老问题,但我认为仍然是实际问题。我编写这个库是为了序列化和反序列化循环数据结构:它也可以与gob一起使用。