Стратегия записи занятий с крио

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

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

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

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

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

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

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


person Zargoon    schedule 15.10.2011    source источник


Ответы (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;
}
person 01es    schedule 18.04.2012