Java Drools持久事实句柄

Java Drools持久事实句柄,java,drools,Java,Drools,我正在使用封送拆收器序列化和反序列化DROOLS会话。它似乎在按预期工作。但是,我注意到,以前创建的事实句柄在尝试在反序列化会话上检索事实时不再有效 下面的测试失败,因为事实变量等于null。请注意,下面的代码是伪代码,只是为了传达想法 Customer c = new Customer(); KieSession kSession = kContainer.newKieSession(); FactHandle h = kSession.insert(c); byte[] bytes =

我正在使用封送拆收器序列化和反序列化DROOLS会话。它似乎在按预期工作。但是,我注意到,以前创建的事实句柄在尝试在反序列化会话上检索事实时不再有效

下面的测试失败,因为事实变量等于null。请注意,下面的代码是伪代码,只是为了传达想法

Customer c = new Customer();

KieSession kSession = kContainer.newKieSession();
FactHandle h = kSession.insert(c);

byte[] bytes = marshaller.marshall(kSession);

KieSession restoredSession = marshaller.unmarshall(bytes);
Object fact = restoredSession.getObject(h);

Assert.assertEquals(c, fact);
我之所以希望保留/重用句柄,是为了能够在分布式环境中以一致的方式检索事实

你知道我怎样才能做到这一点吗

更新:

我也试过普罗霍罗夫先生的建议

Customer c = new Customer();

KieSession kSession = kContainer.newKieSession();
FactHandle originalHandle = kSession.insert(c);

String externalHandle = h.toExternalForm();

byte[] bytes = marshaller.marshall(kSession);

KieSession restoredSession = marshaller.unmarshall(bytes);

FactHandle restoredHandle = DefaultFactHandle.createFromExternalFormat(externalHandle)

Object fact = restoredSession.getObject(restoredHandle);

Assert.assertEquals(c, fact);

谢谢

可能是个愚蠢的问题,但是:什么是
客户
,它是否覆盖
equals()
?客户是域对象/事实。它实现了serializable并实现了自己的等式,即equals和hashcode。我能够对会话进行序列化/反序列化,只是无法使用原始句柄检索事实。啊,我错过了
fact
变量is
null
。句柄可能以某种方式绑定到会话对象(我不知道,因为我这里只看Javadocs)。我建议您尝试在原始句柄上调用
到externalform()
,然后在返回的字符串上使用
DefaultFactHandle.createFromExternalFormat
。谢谢您的建议。我已经完全按照你的建议做了尝试,但仍然没有成功。似乎在创建DefaultFactHandle时,它使用System.identityHashCode(对象)来创建事实handel identityHashCode。会话反序列化后,事实句柄将具有新的identityHashCode。希望这是有道理的。这对我来说是有道理的,而且很糟糕。我没有任何进一步的建议,让我们看看其他人是否有答案。