【问题标题】:Spring gemfire Serialization ExceptionSpring gemfire 序列化异常
【发布时间】:2014-08-12 09:08:35
【问题描述】:

我正在使用 Gemfire Spring 放置/查找 pojo 对象

@Autowired
GemfireTemplate responseTemplate;
....
HTTPAudit audit = new HTTPAudit(sessionId,response);   
responseTemplate.put("Detail", audit);
System.out.println("Get caching...");
SelectResults<HTTPAudit> result = responseTemplate.find("SELECT * from /HTTPAudit WHERE sessionId= $1", sessionId);

HTTPAudit 对象实现了 Serializable 接口。

实体已成功保存在 Gemfire 中,但在尝试反序列化时抛出异常。错误消息是 “com.gemstone.gemfire.SerializationException:在尝试反序列化缓存值时抛出 ClassNotFoundException。”

【问题讨论】:

  • 我正在使用带有 data-policy="EMPTY" 的客户区域。

标签: gemfire spring-data-gemfire


【解决方案1】:

有关您的配置的详细信息在此处不完整。有许多可能的情况会发生这种情况。一种更可能的情况是,上面的代码 sn-p 可能是客户端缓存,其中 /HTTPAudit 是某个对等服务器区域的代理客户端区域(数据策略不清楚,尽管如果这是客户端/服务器拓扑则不那么重要在玩)。

因为您的 HTTPAudit 实现了 java.io.Serializable,GemFire 将使用 Java 序列化通过网络发送对象。

然后,GemFire 会将对象存储在它获得的“形式”中(在本例中为序列化)。

接下来,您继续运行 OQL 语句 (Query) 并继续访问对象 (sessionId) 上的字段。因为 GemFire 无法以“Java 序列化”形式访问数据,所以它必须反序列化该值以检查它的 Query 谓词。

在这种情况下,我猜您的“GemFire Server”节点在 CLASSPATH 上没有它需要的 HTTPAudit 类。

如果您想避免在发出上述 OQL 时对 GemFire 服务器上的 HTTPAudit 对象进行反序列化,那么您应该切换到 PDX 序列化 (http://gemfire.docs.pivotal.io/latest/userguide/developing/data_serialization/gemfire_pdx_serialization.html),并将服务器的配置设置为 'read-serailized ' 属性为真。

但是,您应该小心,因为并非对对象的所有 OQL 操作都必须将对象保持为序列化形式,即使使用 PDX 也是如此。

例如,类似于...的 OQL 查询

SELECT audit.toString() FROM /HTTPAudit audit WHERE ...

甚至会导致在查询执行期间反序列化 PDX 序列化对象。

并不是说调用 toString() 是好的做法(它只是为了说明一点),但是某些对象操作可能会导致 GemFire 在处理过程中反序列化一个值以执行 OQL 语句中的对象操作,即使存储在PDX 序列化形式,因此要求类位于服务器的 CLASSPATH 上。所以,小心点。

但是,在您的情况下,问题是由于您使用效率较低但更标准的 Java 序列化来存储和访问您的对象而引起的。与 PDX 序列化不同,没有“类型元数据”使 GemFire 能够以序列化形式访问对象上的数据,而无需先“反序列化”它。使用 Java 序列化,GemFire 必须反序列化对象才能访问它的信息。

希望这会有所帮助。

【讨论】:

  • 请阅读您的评论...所以,您的 HTTPAudit 对象将被序列化到 GemFire 服务器(从客户端)并以 Java 序列化形式存储在区域中,至少在您的 OQL 查询尝试之前访问对象。
  • 我按照此文档(gemfire.docs.pivotal.io/latest/userguide/gemfire_rest/…) 启用 PDX,但似乎该命令不可用。启动服务器时,我还尝试了 cache.xml 中的 pdx-serializer 标记,它仍然不起作用。我的命令是 gfsh>start server --name=serverD2 --cache-xml-file=cache.xml
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多