Как сериализовать сложный интерфейс с неэкспортированными полями? - PullRequest
4 голосов
/ 13 мая 2011

Мне нужно сериализовать некоторый сложный интерфейс (template.Template).У него много неисследованных полей, и гоб не хочет с ними работать.Любые предложения?

PS На самом деле, я пытаюсь поместить разобранный шаблон в memcache на App Engine.

Ответы [ 2 ]

5 голосов
/ 14 мая 2011

Короткий ответ: обычно есть причина для неэкспортированных полей - например, template.Template содержит информацию, которая изменяется во время синтаксического анализа, поэтому я бы посоветовал не сериализовать их самостоятельно с помощью reflect. Однако интерфейсы GobEncoder и GobDecoder были недавно добавлены к gob; если вам нужно сериализовать сложную структуру с неэкспортированными полями, попросите автора пакета реализовать эти интерфейсы. Более того, реализуйте их самостоятельно (не должно быть трудно для template.Template) и внесите свой патч.

1 голос
/ 13 мая 2011

Если тип относится к другому пакету (например, шаблону), этого нельзя сделать ни с одной из текущих библиотек сериализации для Go (gob, json, bson и т. Д.). Также не следует это делать, поскольку поля не экспортируются.

Однако, если вам действительно нужно, вы можете написать свой собственный сериализатор, используя пакет reflect, в частности Value.Field() и друзей, чтобы получить неэкспортированные поля. Тогда вам просто нужно сохранить их так, чтобы потом можно было их декодировать.

...