Использование сериализации Kryo с Gemfire или Geode

Я хочу использовать библиотеку сериализации Kryo (https://github.com/EsotericSoftware/kryo) с Pivotal Gemfire 8.x и выше. Однако информации о том, как это сделать, не так много. Если у кого-то есть фрагмент кода/конфигурации, показывающий, как интегрировать сериализацию Kryo с Pivotal Gemfire или Apache Geode, это будет очень полезно.

Спасибо.


person jcools    schedule 13.11.2017    source источник


Ответы (2)


Один из вариантов - просто хранить сериализованные байты в геодезической области, например

 byte[] bytes = serializeWithKyro(myObject)
 region.put("key", bytes)

Другой вариант — зарегистрировать DataSerializer, который может сериализоваться с помощью Kyro:

DataSerializer.register(KyroSerializer.class)

public class KyroSerializer extends DataSerializer {
    public boolean toData(Object o, DataOutput out) {
        if(!(o instanceof MyClass)) {
            return false;
        }
        writeWithKyro(o, out);
    }
    ...

}

Вы можете ознакомиться с документацией по DataSerializer для больше информации.

person Dan Smith    schedule 13.11.2017
comment
Спасибо за ваш ответ Дэн. Мне до сих пор не очень понятно, как это будет вызываться Gemfire при сохранении объектов Java в регионах? Как Gemfire узнает, что он должен использовать пользовательский класс KryoSerializer, описанный выше? Кроме того, все ли классы Java теперь должны реализовывать интерфейс DataSerializer? Если я просто переопределю API readObject и writeOjbect (частные методы, вызываемые сериализацией Java), разве это не будет работать прозрачно? - person jcools; 19.11.2017
comment
Вот ссылка на другой пост, где в исходном вопросе говорится о реализации сериализации Kryo с помощью Gemfire: stackoverflow.com/questions/22396122/ Но мне сказали задать там новый вопрос, поэтому я разместил его здесь и дал ссылку на указанный выше поток для справки. - person jcools; 19.11.2017
comment
Когда вы помещаете объект в регион gemfire, этот объект может потребоваться сериализовать и отправить другим членам. Эта сериализация контролируется gemfire. Сначала он будет искать любые зарегистрированные DataSerializer, такие как KyroSerializer. Если у вас есть такой зарегистрированный DataSerializer, вашему объекту не нужно реализовывать DataSerializable. Gemfire просто вызовет этот метод toData в KyroSerializer, который будет выполнять сериализацию объекта. - person Dan Smith; 28.11.2017
comment
Я прочитал документы DataSerializer java и согласно документации по API, я должен указать, какие пользовательские классы Kryo я хочу использовать в API: public Class‹?›[] getSupportedClasses(). Это кажется очень громоздким, потому что у меня почти 70 регионов, и если бы был способ просто предоставить общий способ для всех типов пользовательских классов, это было бы намного проще. - person jcools; 15.12.2017
comment
Кроме того, как ни странно, getId() возвращает одно целое число, поэтому я не могу понять, как это будет соответствовать массиву объектов класса из API getSupportedClasses()? есть идеи? - person jcools; 15.12.2017
comment
Gemfire/Geode не предоставляет возможности заменить собственную сериализацию для нескольких стандартных классов JDK, и поэтому в итоге мы имеем смешанный пакет, то есть Kryo и Gemfire DataSerialization. Это приводит к проблемам совместимости с сериализованными данными. - person jcools; 28.12.2017

Gemfire/Geode не предоставляет возможности заменить собственную сериализацию для нескольких стандартных классов JDK, и поэтому в итоге мы имеем смешанный пакет, то есть Kryo и Gemfire DataSerialization. Это приводит к проблемам совместимости с сериализованными данными.

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

Я не уверен, удалось ли кому-нибудь интегрировать Kryo и Apache Geode/GemFire, но если да, сообщите мне, как вы это сделали.

person jcools    schedule 27.12.2017