【问题标题】:GemFire object serialization using Java Serialization使用 Java 序列化的 GemFire 对象序列化
【发布时间】:2019-02-06 09:52:06
【问题描述】:

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

目前我们将 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 对象内的对象?

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

【问题讨论】:

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


    【解决方案1】:

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

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

    关于...

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

    是的!

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

    SSDG 在对Session 对象进行反序列化/序列化时非常小心,并将其内容委托回 GemFire 以将序列化逻辑应用于Session 的(存储在中的应用程序域对象)的内容,尤其是当 GemFire 的 @987654329 @ 用于反序列化 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) 方法 here。 allowJavaSerialization 默认为 true,参见 here,然后是 here)。

    此时,这一切都在 Pivotal GemFire 手中(在 SSDG 授权之后)。一般来说,Pivotal GemFire 使用以下算法将反序列化应用于任何对象:

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

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

    关于...

    使用 Java 序列化对 Session 对象内部的对象进行序列化需要使用哪个注解或属性?

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

    这意味着您肯定不想要使用 SDG 的 @EnablePdx 注释,因为 SDG 可以很容易地 1) 识别适合使用 PDX 进行反序列化和 2) 反序列化的类型PDX 字节流中的那些对象。更多详细信息可以在关于 PDX here 的参考文档中找到,以及关于 SDG 的 MappingPdxSerializer 的详细信息(@EnablePdx 在幕后应用,正如 GemFire 使用的配置/注册的 PdxSerializer),here .

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      相关资源
      最近更新 更多