Стратегия регистрации классов с помощью крио

Недавно я обнаружил библиотеку kryonet, которая супер удивительна и отлично подходит для моих потребностей.

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

Я знаю, что я могу написать статический метод в каждом объекте, который вернет список всех классов, которые он использует, но мне бы действительно не пришлось это делать (для моих собственных целей времени, а также для тех, кто будет расширять эти объекты).

Я играл вокруг, пытаясь понять, есть ли способ получить все классы, которые ссылаются на объект (как на его поля, так и наследование) из метода getClass(), но у меня не было возможности успех.

Наконец, я знаю, что у kryo есть kryo.setRegistrationOptional(правда), но у меня очень трудное время, пытаясь понять, как его использовать. Когда эта опция включена, kryo все еще, кажется, бросает исключения, если у меня нет зарегистрированных классов. Кроме того, этот метод предполагается намного медленнее, чем возможность регистрации всех классов. Я в порядке, если первый раз, когда вам нужно отправить объект с помощью этого метода, выполняется медленно, но я не знаю, насколько я в порядке с серьезной деградацией производительности каждый раз, когда хочу отправить объект.

В идеале у меня будет пакет объектов, который я хочу отправить с помощью kryonet. Если бы было только что нужно было отсканировать этот пакет и определить все классы, которые мне нужно зарегистрировать, это было бы отлично. Теперь не всем моим клиентам нужно будет регистрировать каждый объект, но это что-то отдельная проблема, и я не знаю, есть ли решение для этого.

Если кто-то может указать мне в правильном направлении, это будет отлично.

Ответ 1

Классы могут поступать из разных мест, таких как диск, сеть, память (динамически генерируется). Поэтому получение информации о классах, которые необходимо зарегистрировать в Kryo, необходимо обрабатывать отдельно для каждого конкретного случая.

Если вы можете читать классы из файла jar, вам следует начать следующий сниппет.

private static List<Class<?>> getFromJarFile(final String jar, final String packageName)    throws ClassNotFoundException, IOException {
    final List<Class<?>> classes = new ArrayList<Class<?>>();
    final JarInputStream jarFile = new JarInputStream(new FileInputStream(jar));
    JarEntry jarEntry = null;
    do {
        jarEntry = jarFile.getNextJarEntry();
        if (jarEntry != null) {
            String className = jarEntry.getName();
            if (className.endsWith(".class")) {
                className = className.substring(0, className.lastIndexOf('.')); // strip filename extension
                if (className.startsWith(packageName + "/")) {  // match classes in the specified package and its subpackages       
                    classes.add(Class.forName(className.replace('/', '.')));
                }
            }
        }
    } while (jarEntry != null);
    return classes;
}