Регистрация всех классов для эффективной сериализации Kryo занимает много времени. Итак, я пытаюсь создать регистратор Kryo, который принимает пакет в качестве параметра (в Java или Scala). Мне интересно, как проще всего это сделать? (Конечно, с отражением, но лучше с существующими библиотеками) Большое спасибо за помощь.
Как зарегистрировать много классов для Kryo Serializer? (например, все классы в пакете)
Ответы (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
Занятия лучше упорядочивать, так как
Set<>
не гарантирует упорядоченность, а в крио порядок важен
- person rpax; 06.07.2017
этот путь кажется опасным...
- person aswzen; 29.04.2021