1 回答
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.*.
- 1 回答
- 0 关注
- 223 浏览
添加回答
举报