使用Java序列化的GemFire对象序列化

时间:2019-02-06 09:52:07

标签: spring-session gemfire spring-data-gemfire

我们在GemFire中使用 Spring Session 管理进行会话处理。

当前,我们已将GemFire版本升级到2.1.2版本。我们已经为Session对象使用了 Delta序列化。我们有一个巨大的Session对象,它在Session对象中具有从属对象。我们已经在旧的GemFire版本2.0.5中使用了 Java序列化

我可以在2.1.2版本的Session中为对象使用 Java序列化吗?

我们正在使用...

sessionSerializerBeanName = 
    GemFireHttpSessionConfiguration.SESSION_DATA_SERIALIZER_BEAN_NAME 

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

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

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

我们通过容器部署来做到这一点,其中一个完整的交易将由多个容器处理。

1 个答案:

答案 0 :(得分:0)

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

仅供参考,要确定Pivotal GemFire的实际版本,必须遵循传递依赖项。例如,Pivotal GemFire(SDG)2.1.2.RELEASE / Lovelace的SSDG 2.1.3.RELEASE depends on弹簧数据。 SDG 2.1.x依次depends on 关键GemFire 9.5.29.5.2是此处使用的Pivotal GemFire版本。

关于...

  

我可以在2.1.2版本的Session中使用Java序列化对象吗?

是的!

通常,如果您的应用程序域对象(例如Customer)作为Session 属性值 1)存储在(HTTP)Session中, java.io.Serializable,2)不存在能够对应用程序域对象进行反序列化的“已注册” PdxSerializerDataSerializer 3)也不存在应用程序域对象(例如Customer)实现了DataSerializblePdxSerializable,则您的对象必须使用 Java序列化可序列化,因此,将使用进行序列化Java序列化,否则将发生序列化异常。每当GemFire通过WAN拓扑在客户端和服务器之间,集群中的对等成员之间(即分布式系统),WAN拓扑上发送数据,或者GemFire将数据溢出/持久存储到磁盘时,尤其如此。如果未使用GemFire自己的Serialization frameworks和机制,则将使用 Java序列化(如果允许)作为后备序列化策略。

SSDG在对Session对象进行反序列化时非常小心,它的内容委托给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默认为 true ,请参见here,然后是here)。

这时,一切都掌握在Pivotal GemFire手中(在SSDG委派之后)。通常,Pivotal GemFire使用以下算法将反序列化应用于任何对象:

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

遵循我上面概述的规则。您可以在here使用的GemFire使用的InternalDataSerializer类中看到此逻辑。最终,如果允许,Java序列化会here发生。

关于...

  

哪些注释或属性需要用于使用Java序列化对Session对象中的对象进行序列化?

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

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

另外,请记住回顾有关数据序列化的Pivotal GemFire documentation及其工作方式。

希望这会有所帮助!