2014-12-04 47 views
1

我正在为我的项目使用GOB编码,并且我发现(长时间战斗后)空字符串未正确编码/解码。在我的代码中,我使用errormessage(string)来报告任何问题,这个错误消息大部分时间是空的。如果我编码一个空字符串,它变成什么都没有,这给我一个解码的问题。我不想改变编码/解码,因为这些部分使用得最多。 如何告诉Go如何编码/解码空字符串?如何对空字符串进行编码/解码

例如: Playground工作代码。 Playground没有工作代码。

+2

看一下这个例子,问题出在你自定义的'MarshalBinary''''UnmarshalBinary'方法而不是gob。如果你导出结构中的字段(使它们为大写),并使用默认的gob编组,你的例子就可以工作。 – 2014-12-04 05:40:40

+0

@James Henstridge谢谢你,它完美无瑕。发布答案,以便我可以将您标为答案。有人必须更新文档顺便说一句,因为我不知道大写字段将解决我第一次有其他问题。 – Dippo 2014-12-04 06:15:41

回答

1

的问题是不是encoding/gob模块,而是你已经申报Msg定制MarshalBinary/UnmarshalBinary方法,不能正确地往返一个空字符串。有两种方法,你可以去这里:

  1. 摆脱MarshalBinary/UnmarshalBinary方法和依靠结构嘴的默认编码。仅仅这种改变就不够了,因为结构的字段没有被导出。如果您很乐意导出字段,那么这是最简单的选择:https://play.golang.org/p/rwzxTtaIh2

  2. 使用可正确地对空行进行空行的编码。一个简单的办法是使用GOB本身来编码结构域:

    func (m Msg) MarshalBinary() ([]byte, error) { 
        var b bytes.Buffer 
        enc := gob.NewEncoder(&b) 
        if err := enc.Encode(m.x); err != nil { 
         return nil, err 
        } 
        if err := enc.Encode(m.y); err != nil { 
         return nil, err 
        } 
        if err := enc.Encode(m.z); err != nil { 
         return nil, err 
        } 
        return b.Bytes(), nil 
    } 
    
    // UnmarshalBinary modifies the receiver so it must take a pointer receiver. 
    func (m *Msg) UnmarshalBinary(data []byte) error { 
        dec := gob.NewDecoder(bytes.NewBuffer(data)) 
        if err := dec.Decode(&m.x); err != nil { 
         return err 
        } 
        if err := dec.Decode(&m.y); err != nil { 
         return err 
        } 
        return dec.Decode(&m.z) 
    } 
    

    你可以用这个例子在这里的实验:https://play.golang.org/p/oNXgt88FtK

第一种选择显然是比较容易的,但第二个可能是如果你的真实例子稍微复杂一点,这很有用。不过,请注意自定义编码器:GOB包含一些旨在检测不兼容性的功能(例如,如果您将某个字段添加到结构中并尝试解码旧数据),这些自定义编码中缺少这些功能。

相关问题