我正在为我的项目使用GOB编码,并且我发现(长时间战斗后)空字符串未正确编码/解码。在我的代码中,我使用errormessage(string)来报告任何问题,这个错误消息大部分时间是空的。如果我编码一个空字符串,它变成什么都没有,这给我一个解码的问题。我不想改变编码/解码,因为这些部分使用得最多。 如何告诉Go如何编码/解码空字符串?如何对空字符串进行编码/解码
例如: Playground工作代码。 Playground没有工作代码。
我正在为我的项目使用GOB编码,并且我发现(长时间战斗后)空字符串未正确编码/解码。在我的代码中,我使用errormessage(string)来报告任何问题,这个错误消息大部分时间是空的。如果我编码一个空字符串,它变成什么都没有,这给我一个解码的问题。我不想改变编码/解码,因为这些部分使用得最多。 如何告诉Go如何编码/解码空字符串?如何对空字符串进行编码/解码
例如: Playground工作代码。 Playground没有工作代码。
的问题是不是encoding/gob
模块,而是你已经申报Msg
定制MarshalBinary
/UnmarshalBinary
方法,不能正确地往返一个空字符串。有两种方法,你可以去这里:
摆脱MarshalBinary
/UnmarshalBinary
方法和依靠结构嘴的默认编码。仅仅这种改变就不够了,因为结构的字段没有被导出。如果您很乐意导出字段,那么这是最简单的选择:https://play.golang.org/p/rwzxTtaIh2
使用可正确地对空行进行空行的编码。一个简单的办法是使用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包含一些旨在检测不兼容性的功能(例如,如果您将某个字段添加到结构中并尝试解码旧数据),这些自定义编码中缺少这些功能。
看一下这个例子,问题出在你自定义的'MarshalBinary''''UnmarshalBinary'方法而不是gob。如果你导出结构中的字段(使它们为大写),并使用默认的gob编组,你的例子就可以工作。 – 2014-12-04 05:40:40
@James Henstridge谢谢你,它完美无瑕。发布答案,以便我可以将您标为答案。有人必须更新文档顺便说一句,因为我不知道大写字段将解决我第一次有其他问题。 – Dippo 2014-12-04 06:15:41