我正在使用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中成功保存实体,但在尝试反序列化时会抛出异常。错误消息是&#34; com.gemstone.gemfire.SerializationException:尝试反序列化缓存的值时抛出了ClassNotFoundException。&#34;
答案 0 :(得分:2)
有关您的配置的详细信息不完整。有许多可能的情况发生这种情况。其中一个更可能的情况是,上面的代码片段可能是客户端缓存,其中/ HTTPAudit是某个对等服务器区域的PROXY客户端区域(数据策略不清楚,但如果这是一个客户端/服务器拓扑,则不是很重要) )。
因为您的HTTPAudit实现了java.io.Serializable,所以GemFire将使用Java Serialization通过线路发送对象。
然后,GemFire会将对象存储在&#34;形式&#34;它得到了(在这种情况下序列化)。
接下来,您将运行OQL语句(Query)并继续访问对象上的字段(sessionId)。因为GemFire无法访问&#34; Java Serialized&#34; form,它必须反序列化值以检查它的查询谓词。
在这种情况下,我猜测你的GemFire服务器&#34;节点在CLASSPATH上没有HTTPAudit类,它需要它。
如果要在发布上述OQL时避免在GemFire服务器上反序列化HTTPAudit对象,则应切换到PDX序列化(http://gemfire.docs.pivotal.io/latest/userguide/developing/data_serialization/gemfire_pdx_serialization.html),并设置服务器&#39; s配置&#39;读取已经过去的&#39;属性为true。
但是,您应该小心,因为并非对象上的所有OQL操作都必须使对象保持序列化形式,即使使用PDX也是如此。
例如,类似于......
的OQL查询SELECT audit.toString()FROM / HTTPAudit audit WHERE ...
在查询执行期间甚至会导致PDX序列化对象被反序列化。
不是调用toString()是一种很好的做法(它只是为了演示一个观点),但某些对象操作可能导致GemFire反序列化一个值,以便在处理过程中在OQL语句中执行对象操作,即使存储在PDX序列化表单,因此要求类在服务器的CLASSPATH上。所以,要小心。
但是,在您的情况下,问题是由于您使用效率较低但更标准的Java序列化来存储和访问对象而引起的。与PDX序列化不同,没有&#34;类型元数据&#34;这使得GemFire能够以序列化的形式访问对象上的数据,而无需&#34;反序列化&#34;它首先。使用Java Serialization,GemFire必须反序列化对象以访问它的信息。
希望这有帮助。