我正在为我的项目使用 GOB 编码,我发现(经过长时间的斗争)空字符串没有正确编码/解码。在我的代码中,我使用错误消息(字符串)来报告任何问题,该错误消息大部分时间都是空的。如果我编码一个空字符串,它就什么都不是,这给我解码带来了问题。我不想改变编码/解码,因为这些部分用得最多。 我如何告诉 Go 如何编码/解码空字符串?
例子: Playground工作代码。 Playground不是工作代码。
最佳答案
问题不在于 encoding/gob
模块,而是您为 声明的自定义
,无法正确往返空字符串。您可以通过两种方式前往此处:MarshalBinary
/UnmarshalBinary
方法>Msg
摆脱
MarshalBinary
/UnmarshalBinary
方法并依赖 GOB 的默认结构编码。仅此更改是不够的,因为不会导出结构的字段。如果您乐于导出字段,那么这是最简单的选项: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 包含一些旨在检测不兼容性的功能(例如,如果您将字段添加到结构并尝试解码旧数据),这些功能是此自定义编码所缺少的。
关于encoding - 如何编码/解码空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27287008/