Como serializar uma interface complexa com campos não exportados?
-
13-11-2019 - |
Pergunta
Preciso serializar alguma interface complexa (template.Template).Tem muitos campos não exportados e muitos não querem trabalhar com eles.Alguma sugestão?
P.S.Na verdade, estou tentando colocar um modelo analisado no memcache no App Engine.
Solução
A resposta curta é que geralmente há um motivo para campos não exportados -template.Template
, por exemplo, contém informações que mudam durante a análise - portanto, desaconselho serializá-las você mesmo com reflect
.No entanto, o GobEncoder
e GobDecoder
interfaces foram adicionadas recentemente ao gob
;se você precisar serializar uma estrutura complexa com campos não exportados, incentive o autor do pacote a implementar essas interfaces.Melhor ainda, implemente-os você mesmo (não deve ser difícil para template.Template
) e contribuir seu patch.
Outras dicas
Se o tipo for de outro pacote (como template), isso não poderá ser feito com nenhuma das bibliotecas de serialização atuais para Go (gob
, json
, bson, etc.).Nem deve isso seja feito, porque os campos não são exportados.
No entanto, se você realmente precisar, você pode escrever seu próprio serializador usando o pacote reflect
, especificamente Value.Field()
e amigos para obter os campos não exportados.Depois, você só precisa armazená-los de uma forma que possa decodificar posteriormente.