You call
   ObjectOutputStream out = new ObjectOutputStream( baos );
   out.writeObject( marshaller );
which would (if it succeeded) just serialize the MarshallerImpl, which is useless as it is nothing but the ballpen with which you write. You need to serialize the "text" via a call to   
   marshaller.marshall(...)
as you do. But, to really get it on paper, you must write to a file. Using FileOutputStream might be an option.

-W


On 12 July 2011 12:37, clement.pernot <clement.pernot@newel.net> wrote:
I have try what you say. This didn't work.
here is my full code:

package com.sample;

import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.marshalling.Marshaller;
import org.drools.marshalling.MarshallerFactory;
import org.drools.marshalling.ObjectMarshallingStrategy;
import org.drools.runtime.StatefulKnowledgeSession;

public class test{

       private static void compileRuleBase2( String drlPath, String rbPath )
throws Exception {
               KnowledgeBuilder kBuilder =
KnowledgeBuilderFactory.newKnowledgeBuilder();
               kBuilder.add( ResourceFactory.newFileResource( drlPath ),
ResourceType.DRL );
               if( kBuilder.hasErrors() ){
                   for( KnowledgeBuilderError err: kBuilder.getErrors() ){
                       System.err.println( err.toString() );
                   }
                   throw new IllegalStateException( "DRL errors" );
               }
               KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
               kBase.addKnowledgePackages( kBuilder.getKnowledgePackages() );

               try {
                       KnowledgeBase kbase = readKnowledgeBase();
                       StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

                       Message message = new Message();
                       message.setMessage("Hello World");
                       message.setStatus(Message.HELLO);

                       ksession.insert(message);

                       ObjectMarshallingStrategy oms =
MarshallerFactory.newIdentityMarshallingStrategy();
               ByteArrayOutputStream baos = new ByteArrayOutputStream();
                       Marshaller marshaller = MarshallerFactory.newMarshaller(
ksession.getKnowledgeBase(), new ObjectMarshallingStrategy[]{ oms } );

                       marshaller.marshall( baos, ksession );

                       ObjectOutputStream out = new ObjectOutputStream( baos );
                   out.writeObject( marshaller );
                   out.close();

                       baos.close();
                       ksession.fireAllRules();

               } catch (Throwable t) {
                       t.printStackTrace();
               }
           }

       public static final void main(String[] args) {
               try {
                       compileRuleBase2("Sample.drl", "drools_compiled_file_with_fact" );
               } catch (Exception e) {
                       e.printStackTrace();
               }
       }

       private static KnowledgeBase readKnowledgeBase() throws Exception {
               KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
               kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"),
ResourceType.DRL);
               KnowledgeBuilderErrors errors = kbuilder.getErrors();
               if (errors.size() > 0) {
                       for (KnowledgeBuilderError error: errors) {
                               System.err.println(error);
                       }
                       throw new IllegalArgumentException("Could not parse knowledge.");
               }
               KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
               kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
               return kbase;
       }

       public static class Message implements Serializable{

               public static final int HELLO = 0;
               public static final int GOODBYE = 1;
               private String message;
               private int status;

               public String getMessage() {
                       return this.message;
               }
               public void setMessage(String message) {
                       this.message = message;
               }
               public int getStatus() {
                       return this.status;
               }
               public void setStatus(int status) {
                       this.status = status;
               }
       }
}



here is my error:

java.io.NotSerializableException:
org.drools.marshalling.impl.DefaultMarshaller
       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
       at com.sample.test.compileRuleBase2(test.java:59)
       at com.sample.test.main(test.java:73)


Thank you for your reply, I think I am near the solution

--
View this message in context: http://drools.46999.n3.nabble.com/Drools-and-serialize-tp3161882p3162038.html
Sent from the Drools: User forum mailing list archive at Nabble.com.
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users