【问题标题】:How to serialize a complex interface with unexported fields?如何序列化具有未导出字段的复杂接口?
【发布时间】:2018-05-17 00:28:57
【问题描述】:

我需要序列化一些复杂的接口(template.Template)。它有许多未导出的字段,gob 不想使用它们。有什么建议吗?

附:实际上,我试图将解析后的模板放到 App Engine 上的内存缓存中。

【问题讨论】:

    标签: serialization go gob


    【解决方案1】:

    简短的回答是,未导出字段通常是有原因的——例如,template.Template 包含在解析过程中发生变化的信息——所以我建议不要使用reflect 自己序列化它们。但是,GobEncoderGobDecoder 接口最近被添加到gob;如果您需要序列化具有未导出字段的复杂结构,请鼓励包的作者实现这些接口。更好的是,自己实现它们(对于template.Templatecontribute 你的补丁应该不难。

    【讨论】:

      【解决方案2】:

      如果类型来自另一个包(例如模板),则无法使用任何当前的 Go 序列化库(gobjson、bson 等)来完成。也不不应该这样做,因为这些字段是未导出的。

      但是,如果您真的需要,您可以使用包reflect,特别是Value.Field() 和朋友编写自己的序列化程序来获取未导出的字段。然后,您只需将它们存储在以后可以解码的方式中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多