亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法用編碼/gob 序列化循環數據結構?

有沒有辦法用編碼/gob 序列化循環數據結構?

Go
喵喔喔 2021-09-13 20:02:42
我正在將神經網絡庫移植到 Go。我希望能夠保存和恢復經過訓練的網絡,因此我嘗試直接對其進行序列化。問題是,網絡結構在其字段中包含循環(神經元 A 與神經元 B 有連接,而神經元 B 與神經元 A 有連接)。每當我嘗試使用編碼/gob 序列化整個網絡時,它都會因堆棧溢出而失敗。這是一個以相同方式中斷的非常簡單的代碼示例:package mainimport (    "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除非重寫庫的整個結構以避免循環,否則有沒有直接的方法來解決這個問題?
查看完整描述

1 回答

?
慕田峪4524236

TA貢獻1875條經驗 獲得超5個贊

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


您可以在您的類型上實現BinaryMarshaler/BinaryUnmarshaler接口作為解決方法,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.*.


查看完整回答
反對 回復 2021-09-13
  • 1 回答
  • 0 關注
  • 244 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號