Стратегия регистрации классов с крио

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

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

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

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

Наконец, я знаю, что у kryo есть kryo.setRegistrationOptional(true), но мне очень трудно понять, как его использовать. Когда эта опция включена, 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;
}
Другие вопросы по тегам