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.

