[rules-users] Serialization of packages: NotSerializableException (KnowledgePackageImp) and InvalidClassException (serialVersionUID)

Jervisliu jliu at redhat.com
Thu Oct 29 21:07:39 EDT 2009


Hi Bernd,

This can be related to https://jira.jboss.org/jira/browse/JBRULES-1946. 
JBRULES-1946 was fixed on Drools trunk and Drools 5.0.2. There were also 
some test cases:

/labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java

You may want to try the test cases to see if it fixed your problem. If 
not, please file a jira with a test case. Thanks.

Cheers,
Jervis Liu

Bernd Rücker wrote:
>
> Has anybody an idea what’s these problems? I didn’t find any test 
> cases, are there any test cases for serializing the PKG files? What am 
> I doing wrong?
>
> *Von:* rules-users-bounces at lists.jboss.org 
> [mailto:rules-users-bounces at lists.jboss.org] *Im Auftrag von *Bernd Rücker
> *Gesendet:* Dienstag, 1. September 2009 17:26
> *An:* rules-users at lists.jboss.org
> *Betreff:* [rules-users] WG: Serialization of packages: 
> InvalidClassException / serialVersionUID
>
> The exception of the KnowledgePackage serialization (by the way, this 
> is described in the docs, that you can serialize the KnowledgePackages!):
>
> /home/bruecker/workspace/1/iKS2/iks_drools_rules/drools-rules.pkg
>
> Exception in thread "main" java.io.NotSerializableException:
>
> org.drools.definitions.impl.KnowledgePackageImp
>
> at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
>
> at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
>
> at
>
> org.drools.util.DroolsStreamUtils.streamOut(DroolsStreamUtils.java:79)
>
> at
>
> org.drools.util.DroolsStreamUtils.streamOut(DroolsStreamUtils.java:61)
>
> So this doesn’t work either 
> (http://downloads.jboss.com/drools/docs/5.0.1.26597.FINAL/drools-expert/html_single/index.html#d0e992):
>
> *3.2.4. Building and Deployment in Separate Processes*
>
> Both the KnowledgeBase and the KnowledgePackage are units of 
> deployment and serializable. This means you can have one machine do 
> any necessary building, requiring drools-compiler.jar, and have 
> another machine deploy and execute everything, needing only 
> drools-core.jar.
>
> Although serialization is standard Java, we present an example of how 
> one machine might write out the deployment unit and how another 
> machine might read in and use that deployment unit.
>
> *Example 3.15. Writing the KnowledgePackage to an OutputStream*
>
> ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream( 
> fileName ) );
>
> out.writeObject( kpkgs );
>
> out.close();
>
> *Example 3.16. Reading the KnowledgePackage from an InputStream*
>
> ObjectInputStream in = new ObjectInputStream( new FileInputStream( 
> fileName ) );
>
> // The input stream might contain an individual
>
> // package or a collection.
>
> @SuppressWarnings( "unchecked" )
>
> Collection<KnowledgePackage> kpkgs =
>
> ()in.readObject( Collection<KnowledgePackage> );
>
> in.close();
>
> KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
>
> kbase.addKnowledgePackages( kpkgs );
>
> The KnowledgeBase is also serializable and some people may prefer to 
> build and then store the KnowledgeBase itself, instead of the 
> Knowledge Packages.
>
> Drools Guvnor, our server side management system, uses this deployment 
> approach. After Guvnor has compiled and published serialized Knowledge 
> Packages on a URL, Drools can use the URL resource type to load them.
>
> *Von:* Bernd Rücker [mailto:bernd.ruecker at camunda.com]
> *Gesendet:* Dienstag, 1. September 2009 17:21
> *An:* 'rules-users at lists.jboss.org'
> *Betreff:* Serialization of packages: InvalidClassException / 
> serialVersionUID
>
> Hi!
>
> I really struggled some time with serialization issues: I want to 
> create a pkg and package that with the jar. >From there I want to read 
> it during runtime.
>
> Easy I thought. Drools 5 way should be to serialize the KnowledgeBase, 
> right? At least, this is what the AntTask does.
>
> If I try to serialize the KnowledgePackage I get an excpetion anyway:
>
> Okay. Back to the KnowledgeBase. Serialized with Drools 5.0.0.M4 and 
> try to read it with 5.0.0.M5:
>
> Caused by: java.io.InvalidClassException:
>
> org.drools.impl.KnowledgeBaseImpl;
>
> local class incompatible: stream classdesc serialVersionUID = 
> -4540376767025107954,
>
> local class serialVersionUID = -3186110098262381425
>
> So it seems Drools Packages are NOT compatible between minor versions? 
> This would be a disaster for deployment. Or do I serialize the wrong 
> thing? Unfortunately I didn’t find anything in the docs about it.
>
> Then I tried to do it the “old” Drools 4 way and serialize Package 
> objects, but same problem with a different serialVersionUID!
>
> Why do these important classes don’t have a serialVersionUID? Or how 
> should that be loaded? Must be a big issue with Govner, so I think 
> there must be a solution already?
>
> Thanks for any help!
>
> Cheers
>
> Bernd
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>   




More information about the rules-users mailing list