Как зарегистрировать много классов для Kryo Serializer? (например, все классы в пакете)

Регистрация всех классов для эффективной сериализации Kryo занимает много времени. Итак, я пытаюсь создать регистратор Kryo, который принимает пакет в качестве параметра (в Java или Scala). Мне интересно, как проще всего это сделать? (Конечно, с отражением, но лучше с существующими библиотеками) Большое спасибо за помощь.


person tribbloid    schedule 15.05.2015    source источник


Ответы (1)


Это не пользовательский регистратор (хотя вы, несомненно, можете превратить его в один), но вы можете использовать библиотеку Reflections. чтобы получить Set всех классов, расширяющих Object в интересующем пакете. Затем просто зарегистрируйте каждого члена набора.

Reflections reflections = new Reflections(new ConfigurationBuilder()
        .setUrls(ClasspathHelper.forPackage("your.package"))
        .setScanners(new SubTypesScanner(false)));
Set<Class<? extends Object>> types = reflections.getSubTypesOf(Object.class);
for (Class c : types) {
    kryoInstance.register(c.getClass());
}

Обратите внимание, что это зарегистрирует КАЖДЫЙ класс, который расширяет объект (включая анонимный, внутренний и т. д.). Вам, вероятно, будет лучше использовать возможности аннотации библиотеки, чтобы ограничить то, что вы регистрируете, теми классами, которые вам действительно нужны, если только это не все, что есть в указанном пакете!

person blazetopher    schedule 15.05.2015
comment
Занятия лучше упорядочивать, так как Set<> не гарантирует упорядоченность, а в крио порядок важен - person rpax; 06.07.2017
comment
этот путь кажется опасным... - person aswzen; 29.04.2021