Добрый день.
У меня в проекте есть один сложный документ, составленный из нескольких EmbeddedDocument'ов довольно большой вложенности - профиль игрока в RPG-игре. Всего в документе задействовано около 50 классов. Местами используются включение через @EmbedMany, что при гидрации документов даёт PersistentCollection'ы. Почти все классы были автоматически сгенерены thrift-compiler'ом, поэтому добавление к ним методов, которые будут очищать от PersistentCollection, как мне кажется, немного противоестественно. Потом по этим сгенеренным классам были сгенерены doctrine odm mapping'и в виде yaml-файлов.
Задача: загрузить профиль игрока из mongodb, используя doctrine odm, и записать в thrift.
Проблема: pure-php реализация thrift'а справляется с PersistentCollection'ами нормально. Но вот при попытке записи в thrift с использованием TBinaryProtocolAccelerated (и включенного бинарного расширения thrift_protocol.so), запись падает с Exception'ом:
Thrift\Exception\TProtocolException: Attempt to send non-object type as a T_STRUCT
Возможные решения (как мне видится, в порядке приоритета):
- Переопределить HydratorFactory своим классом, который не будет заниматься созданием PersistenCollection'ов: www.doctrine-project.org/api/mongodb_odm/1.0/sourc... . Мне не хватает понимания, какие подводные камни при этом могут возникнуть. Не снесет ли крышу всяким UnitOfWork и DocumentManager'ам?
- Использовать тот же thrift для десериализации данных из бд, а сами данные хранить в виде длинной бинарной строки. Минус: мне все же хочется удобный доступ к данным в бд. Можно, в принципе, сохранять данные в развернутом виде + в виде бинарной строки, которую использовать для thrift-десериализации, но тогда получается лишний оверхед в хранении и в общении с базой.
- Написать рекурсивный walker, который будет все коллекции подменять на их getValues()
- Использовать другой odm, например Mandango. Нужно провести эксперимент, может это и сработает. Но трудозатраты на подключение этого всего дела и на написание генератора mapping'ов все равно довольно существенные.
Помогите советом, пожалуйста. Может я чего-то в упор не вижу, и задача решается просто и элегантно?