unable to serialize a composite activity either into xoml or binary stream?

Locked unable to serialize a composite activity either into xoml or binary stream?

  • mardi 17 avril 2012 10:22
     
     

    hi experts,

    i have a custom activity, as below:

    public class BuildMachine : SequenceActivity

    {

    }

    the BuildMachine activity will use several other custom activities to complete the logic.

    i need to serialize this activity into either xoml file , or into binary stream:
    -------------------------------
    [1] serialize to xoml markup
    -------------------------------
    Activity activity = new BuildMachine();

    var stream = new MemoryStream();
    System.Xml.XmlWriter xmlWriter = XmlWriter.Create(stream);

    ServiceContainer container = new ServiceContainer();
    TypeProvider provider = new TypeProvider(container);
    foreach (var a in this._referencedAssemblies)
    {
      provider.AddAssembly(a);
    }
    container.AddService(typeof(ITypeProvider), provider);
    DesignerSerializationManager dsm = new DesignerSerializationManager(container);
    using (dsm.CreateSession())
    {
     // need to check the type of activity
     if (!(activity is SequentialWorkflowActivity) && (!(activity is StateMachineWorkflowActivity)))
      {
         if (activity is CompositeActivity)
         {
           CompositeActivity compositeActivityactivity = (CompositeActivity)activity;
           CompositeActivityMarkupSerializer compositeActivityMarkupSerializer = new CompositeActivityMarkupSerializer();
           compositeActivityMarkupSerializer.Serialize(xmlWriter, compositeActivityactivity);
         }
         else
         {
           // it is just a  activity, not a workflow
           ActivityMarkupSerializer activityMarkupSerializer = new ActivityMarkupSerializer();
           activityMarkupSerializer.Serialize(xmlWriter, activity);
         }

      }
      else
      {
          // it is workflow
          var workflowMarkupSerializer = new WorkflowMarkupSerializer();
          workflowMarkupSerializer.Serialize(xmlWriter, activity);
      }
    }

    xmlWriter.Flush();
    var file = new FileStream(activity.QualifiedName, FileMode.Create);
    file.Write(stream.GetBuffer(), 0, stream.GetBuffer().Length);
    file.Close();

    -------------------------------
    [2] serialize to binary stream
    -------------------------------
    Activity activity = new BuildMachine();
    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new BinaryFormatter();
    System.IO.MemoryStream stream = new MemoryStream();
    formatter.Serialize(stream, activity);
    byte[] data = new byte[stream.Length];
    Array.Copy(data, stream.GetBuffer(), stream.Length);
    stream.Close();

    but, either way not succeed. the [1] way give a incomplete xoml file, the [2] way throw out exception at .Serialize() call, saying "BuildMachine is not marked as serializable", (i tried to add [System.Serializable] to class BuildMachine, but gives this error:

    System.Workflow.Activities.SequenceActivity' in Assembly 'System.Workflow.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is not marked as serializable.

    what i have to do ?

    Thanks in advance.