Сериализация объектов GemFire ​​с использованием сериализации Java - PullRequest
0 голосов
/ 06 февраля 2019

Мы используем управление Spring Session с GemFire ​​для обработки сеанса.

В настоящее время мы обновили версию GemFire ​​до версии 2.1.2.Мы использовали Delta Serialization для Session объекта.У нас есть огромный объект Session, и у него есть зависимые объекты внутри объекта Session.Мы использовали Java Serialization в старой версии GemFire ​​2.0.5.

Могу ли я использовать Сериализация Java для объекта внутри сеанса в 2.1.2 версии?

Мы используем ...

sessionSerializerBeanName = 
    GemFireHttpSessionConfiguration.SESSION_DATA_SERIALIZER_BEAN_NAME 

... для сериализации Session объекта.

При использовании этого подхода мы должны загрузить все файлы JAR приложения на сервер кэширования GemFire.

Какую аннотацию или атрибут необходимо использовать для сериализации объектов внутри объекта Session с использованием Сериализация Java ?

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

1 Ответ

0 голосов
/ 13 февраля 2019

Во-первых, версиями GemFire, на которые вы ссылаетесь, являются Spring Session для версий Pivotal GemFire ​​(например, Spring Session Data GemFire ​​ (SSDG) 2.1.2.RELEASE; см. здесь ).

К вашему сведению, чтобы определить актуальную версию Pivotal GemFire, вы должны следовать переходным зависимостям.Например, SSDG 2.1.2.RELEASE зависит от данных Spring для Pivotal GemFire ​​(SDG) Lovelace / 2.1.3.RELEASE.SDG 2.1.x в свою очередь зависит от Pivotal GemFire ​​ 9.5.2.9.5.2 используется ли здесь версия Pivotal GemFire.

Относительно ...

Можно ли использовать сериализацию Java для объекта внутри сеанса в версии 2.1.2?

Да!

Как правило, если объекты домена вашего приложения (например, Customer) хранятся в (HTTP) Session как Session значение атрибута 1) равно java.io.Serializable, 2) существует НЕ существует "зарегистрированный" PdxSerializer или DataSerializer способныйде / сериализации объектов домена вашего приложения 3) и ни один из объектов домена вашего приложения (например, Customer) не реализует DataSerializble или PdxSerializable, тогда ваши объекты должны бытьсериализуется с использованием Java Serialization и, следовательно, будет сериализовано с использованием Java Serialization , иначе возникнет исключение сериализации.Это особенно верно всякий раз, когда GemFire ​​передает данные между клиентом и сервером, между равноправными членами в кластере (то есть распределенной системе), по топологии WAN или в любое время, когда GemFire ​​переполняет / сохраняет данные на диск.Если собственные механизмы GemFire ​​ Serialization и механика не используются, тогда Java Serialization (если разрешено) - это применяемая резервная стратегия сериализации.

SSDG осторожен при де / сериализацииобъект Session и его содержимое для делегирования обратно в GemFire ​​для применения логики сериализации к содержимому (объекты домена приложения, хранящиеся в), а также Session, особенно когда GemFire ​​ Data Serialization framework используется для де / сериализации самого объекта Session, что в вашем случае, так как вы настроили ...

sessionSerializerBeanName = 
    GemFireHttpSessionConfiguration.SESSION_DATA_SERIALIZER_BEAN_NAME

Технически, вы можете увидеть это делегирование, начиная сSession объект ( здесь ), который записывает атрибуты Session (ключ / значения), которые будут делегироваться «зарегистрированным», и предоставляется SSDG, классом DataSerializationSessionAttributesSerializer, который будет сериализоватьзначения атрибута Session от делегата обратно в GemFire, здесь .

Вспомогательный метод SSDG serializeObject(:Object), в свою очередь, просто делегирует GemFire ​​DataSerializable.writeObject(:Object, :DataOutput, allowJavaSerialization:boolean) метод, здесь .allowJavaSerialization по умолчанию true , см. здесь , затем здесь ).

На данный момент все это в руках Pivotal GemFire(после делегирования SSDG).В общем, Pivotal GemFire ​​использует следующий алгоритм для применения де-сериализации к любому объекту:

1) Сериализация PDX 2) Сериализация данных 3) Сериализация Java

В соответствии с правилами, изложенными выше.Вы можете видеть эту логику в классе InternalDataSerializer, используемом GemFire, здесь .В конечном счете, Сериализация Java происходит здесь , если разрешено.

Относительно ...

Какую аннотацию или атрибут необходимо использовать для сериализации объектов внутриобъект Session, использующий сериализацию Java?

Нет аннотаций и / или атрибутов для применения сериализация Java ;это стратегия сериализации по умолчанию / резервная, используемая, когда никакая другая опция не была явно настроена.

Это означает, что вы определенно не хотите использовать аннотацию SDG @EnablePdx, поскольку SDG позволяет очень просто: 1) определить типы, подходящие для де / сериализации с помощью PDX, и 2) для де / сериализации этих объектов в потоке байтов PDX.Более подробную информацию можно найти в справочных документах о PDX здесь вместе с подробностями о SDG MappingPdxSerializer (который @EnablePdx применяет скрытно, как сконфигурированный / зарегистрированный PdxSerializer, используемый GemFire), здесь .

Также не забудьте просмотреть документацию Pivotal GemFire ​​ о сериализации данных и о том, как она работает.

Надеюсь, это поможет!

...