使用Java Serialization进行GemFire对象序列化

问题描述 投票:0回答:1

我们使用Spring会话管理和GemFire进行会话处理。

目前我们将GemFire版本升级到2.1.2版本。我们使用Delta序列化来表示Session对象。我们有一个庞大的Session对象,它在Session对象中有依赖对象。我们在旧的GemFire版本2.0.5中使用了Java Serialization。

我可以在2.1.2版本的Session中使用Java Serialization作为对象吗?

我们正在使用......

sessionSerializerBeanName = 
    GemFireHttpSessionConfiguration.SESSION_DATA_SERIALIZER_BEAN_NAME 

...用于序列化Session对象。

使用此方法时,我们必须将所有应用程序JAR加载到GemFire缓存服务器。

需要使用哪个注释或属性来使用Java序列化序列化Session对象中的对象?

我们正在使用容器部署来执行此操作,其中一个完整的事务将由多个容器处理。

spring-session gemfire spring-data-gemfire
1个回答
0
投票

首先,您引用的GemFire版本是Pivotal GemFire版本的Spring Session(例如Spring Session Data GemFire(SSDG)2.1.2.RELEASE;请参阅here)。

仅供参考,要确定Pivotal GemFire的实际版本,您必须遵循传递依赖关系。例如,SSDG 2.1.2.RELEASE depends on Pivotal GemFire(SDG)Lovelace / 2.1.3.RELEASE的春季数据。 SDG 2.1.x反过来depends on Pivotal GemFire 9.5.29.5.2是这里使用的Pivotal GemFire版本。

关于...

我可以在2.1.2版本的Session中使用Java Serialization作为对象吗?

是!

一般来说,如果您的应用程序域对象(例如Customer)存储在(HTTP)Session中作为Session属性值1)是java.io.Serializable,2)不存在能够对您的应用程序进行de / serial化的“已注册”PdxSerializerDataSerializer域对象3)你的任何应用程序域对象(例如Customer)也没有实现DataSerializblePdxSerializable,那么你的对象必须使用Java Serialization进行序列化,因此,将使用Java Serialization进行序列化,否则将发生序列化异常。无论何时GemFire在客户端和服务器之间,集群中的对等成员(即分布式系统)之间,通过WAN拓扑或任何时候GemFire溢出/持久化数据到磁盘,都会发生这种情况。如果未使用GemFire自己的Serialization frameworks和机制,那么Java Serialization(如果允许)是应用的后备序列化策略。

在对Session对象进行de / serial化时,SSDG非常谨慎,并将其内容委托给GemFire,以便将序列化逻辑应用于Session的(应用程序域对象)内容,尤其是当GemFire的Data Serialization framework用于对Session进行序列化时对象本身,在你的情况下,它是你已经配置...

sessionSerializerBeanName = 
    GemFireHttpSessionConfiguration.SESSION_DATA_SERIALIZER_BEAN_NAME

从技术上讲,你可以看到这个委托,从Session对象(here)开始,它正在编写Session属性(键/值),它将委托给“已注册”,并由SSDG,DataSerializationSessionAttributesSerializer类提供,它将序列化Session将代理人的值归属于GemFire,here

SSDG serializeObject(:Object)辅助方法反过来只委托给GemFire的DataSerializable.writeObject(:Object, :DataOutput, allowJavaSerialization:boolean)方法,hereallowJavaSerialization默认是真的,参见here,然后是here)。

在这一点上,这一切都在Pivotal GemFire的手中(在SSDG授权之后)。通常,Pivotal GemFire使用以下算法将de / serialization应用于任何对象:

1)PDX序列化2)数据序列化3)Java序列化

遵循我上面概述的规则。你可以在GemFire使用的InternalDataSerializer类中看到这个逻辑,here。最终,Java序列化发生了here,iff允许。

关于...

需要使用哪个注释或属性来使用Java序列化序列化Session对象内的对象?

应用Java序列化没有注释和/或属性;它是未明确配置其他选项时使用的默认/回退序列化策略。

这意味着你绝对不想使用SDG的@EnablePdx注释,因为SDG可以很容易地1)识别符合PDX去/序列化的类型,2)在PDX字节流中对这些对象进行去/序列化。更多细节可以在关于PDX here的参考文档中找到,以及有关SDG的MappingPdxSerializer(其中@EnablePdx应用于引擎盖下,作为GemFire使用的配置/注册的PdxSerializer),here的详细信息。

另外,请记得查看关于数据序列化的Pivotal GemFire documentation及其工作原理。

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.