encoding - 如何编码/解码空字符串

标签 encoding character-encoding go gob

我正在为我的项目使用 GOB 编码,我发现(经过长时间的斗争)空字符串没有正确编码/解码。在我的代码中,我使用错误消息(字符串)来报告任何问题,该错误消息大部分时间都是空的。如果我编码一个空字符串,它就什么都不是,这给我解码带来了问题。我不想改变编码/解码,因为这些部分用得最多。 我如何告诉 Go 如何编码/解码空字符串?

例子: Playground工作代码。 Playground不是工作代码。

最佳答案

问题不在于 encoding/gob 模块,而是您为 声明的自定义 MarshalBinary/UnmarshalBinary 方法>Msg,无法正确往返空字符串。您可以通过两种方式前往此处:

  1. 摆脱 MarshalBinary/UnmarshalBinary 方法并依赖 GOB 的默认结构编码。仅此更改是不够的,因为不会导出结构的字段。如果您乐于导出字段,那么这是最简单的选项: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 包含一些旨在检测不兼容性的功能(例如,如果您将字段添加到结构并尝试解码旧数据),这些功能是此自定义编码所缺少的。

关于encoding - 如何编码/解码空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27287008/

相关文章:

image - 如何验证此 URL 重定向到图像?

php - 在 MySQL 数据库中保存口音

Java 文本编码

dictionary - Golang fatal error : concurrent map read and map write

java - 如何向 J2SE 1.4 API 添加对字符集 IBM437 的支持

css - 节点 sass : Fontawesome icon encoding issues

java - 数据库中的编码问题

windows - 如何创建具有特定编码的 ZIP 文件

go - 如何让 Go 接受网络请求

go - 如何使用 gorm 创建到 mysql 的 ssl 连接?