首先,您所指的 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 的数据序列化及其工作原理。
希望这会有所帮助!