Как показывает ответ Младена Яблановича, вы можете переопределить to_yaml
.Вы можете добавить массив с именем «атрибуты» (особенно стараясь избежать этого имени, если в хэше есть ключ с этим именем (стараясь избежать экранированного имени, если ... и т. Д.)).Тем не менее, вам нужно некоторое знание внутренних элементов, чтобы сделать эту работу (out.map(tag_uri, to_yaml_style)
и его вариации нетривиальны и плохо документированы: источники различных интерпретаторов Ruby - ваш лучший выбор).
К сожалению, выТакже необходимо переопределить процесс десериализации.То, как вы можете повторно использовать существующий код, близко к полностью недокументированному.Как и в этом ответе , вы должны добавить to_yaml_type
и код десериализации, используя YAML::add_domain_type
.Оттуда вы в значительной степени сами по себе: вам нужно написать половину парсера YAML, чтобы проанализировать строку yamled и преобразовать ее в ваш объект.
Это можно понять, но более простое решение, которое я реализовал в прошлый раз, когда хотел этого, состояло в том, чтобы просто сделать Hash атрибутом моего объекта вместо расширения Hash.А потом я понял, что на самом деле я не реализую подкласс Hash.То, что что-то хранит пары ключ-значение, не обязательно означает, что является хэшем.Если вы реализуете :[]
, :[]=
и each
, вы обычно проделываете долгий путь к возможности обрабатывать объект, как если бы он был хешем.