Сериализатор пользовательских атрибутов Titan 0.9.0.M2 — HashMap в качестве значения свойства

Версия для Титана: 0.9.0.M2

Я пытаюсь реализовать собственный сериализатор для использования HashMap в качестве значения свойства. Я написал свой класс в соответствии с инструкциями, приведенными здесь. Он реализует AttributeSerializer, имеет метод equals и, наконец, конструктор без аргументов.

Я установил следующие параметры конфигурации:

attributes.custom.attribute10.attribute-class = java.util.HashMap attribute.custom.attribute10.serializer-class = com.graph.HashMapSerializer

Я упаковал сериализатор в банку и поместил в папку lib дистрибутива Titan. Я пытаюсь запустить Titan, но вижу ошибку "Необходимо установить значение конфигурации: root.attributes.custom.serializer-class", а также " Не удалось создать экземпляр настроенного класса сериализатора» в журналах «gremlin-server». Я пробовал кучу вариантов, включая изменение номера атрибута и размещение в банке в нескольких разных местах, но безуспешно.

Пожалуйста, прокомментируйте, правильно ли я делаю это, а также возможные решения, пожалуйста. Я прочитал в сообщении, связанном с Titan, что некоторые ключи конфигурации могут меняться от версии к версии, может ли это быть какой-то причиной?

Также кто-нибудь может прокомментировать, как указать полное имя «пользовательский класс», имя «пользовательский сериализатор» и где именно разместить банку?

Спасибо за ваше время.


person user228001    schedule 22.07.2015    source источник


Ответы (1)


Размещение банки под $TITAN_HOME/lib — это нормально, но я думаю, что ваши свойства должны выглядеть так:

attributes.custom.attribute1.attribute-class = java.util.HashMap
attributes.custom.attribute1.serializer-class = com.graph.HashMapSerializer

В примере в документации упоминается, что у них уже было настроено 9 настраиваемых атрибутов, поэтому он использовал attribute10. Вы можете проверить, какие сериализаторы установлены в вашем графе, используя интерфейс TitanManagement.

$ ./bin/gremlin.sh

         \,,,/
         (o o)
-----oOOo-(3)-oOOo-----
plugin activated: tinkerpop.server
plugin activated: tinkerpop.utilities
plugin activated: tinkerpop.hadoop
plugin activated: tinkerpop.tinkergraph
plugin activated: aurelius.titan
gremlin> graph = TitanFactory.build().set('storage.backend','berkeleyje').set('storage.directory','/home/vagrant/titan-0.9.0-SNAPSHOT-hadoop1/db/berkeley').open()
==>standardtitangraph[berkeleyje:/home/vagrant/titan-0.9.0-SNAPSHOT-hadoop1/db/berkeley]
gremlin> mgmt = graph.openManagement()
==>com.thinkaurelius.titan.graphdb.database.management.ManagementSystem@78226c36
gremlin> mgmt.get('attributes.custom.attribute10.attribute-class')
==>null
gremlin> mgmt.get('attributes.custom.attribute1.attribute-class')
==>java.util.HashMap
person Jason Plurad    schedule 22.07.2015
comment
:Привет Джейсон, спасибо за вклад. Я правильно настроил график и смог добавить свойство HashMap. Но когда я пытаюсь получить добавленное значение, я получаю сообщение об ошибке «Exception in thread main java.lang.ArrayIndexOutOfBoundsException: требуемый размер [1] превышает фактический оставшийся размер [0]». Я разместил свой код для класса HashMapSerializer здесь, а также полный трассировки стека. Если позволит время, не могли бы вы взглянуть на него и дать некоторые комментарии. - person user228001; 23.07.2015
comment
: Кроме того, после выполнения вышеуказанных шагов в своем ответе вы проверили его, добавив и извлекая значение свойства HashMap? - person user228001; 23.07.2015