2014-12-04 169 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包含一些旨在檢測不兼容性的功能(例如,如果您將某個字段添加到結構中並嘗試解碼舊數據),這些自定義編碼中缺少這些功能。

相關問題