49 lines
2.6 KiB
C#
49 lines
2.6 KiB
C#
|
namespace System.Workflow.ComponentModel.Serialization
|
||
|
{
|
||
|
using System;
|
||
|
using System.CodeDom;
|
||
|
using System.ComponentModel;
|
||
|
using System.ComponentModel.Design.Serialization;
|
||
|
using System.Workflow.ComponentModel.Compiler;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Specialized;
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
// This serializer will serialize any ICollection<String> object into code statements that constructs the collection.
|
||
|
// The default serializer serializes the collection as resource because ICollection<String> is serializable.
|
||
|
// We originally add this serializer to deal with the SynchronizationHandles property on SynchronizationScopeActivity.
|
||
|
// It was a problem because this serializer will be invoked for any property of ICollection<String> type. Now I've
|
||
|
// made this generic enough to be used by any such properties.
|
||
|
internal sealed class SynchronizationHandlesCodeDomSerializer : CodeDomSerializer
|
||
|
{
|
||
|
public override object Serialize(IDesignerSerializationManager manager, object obj)
|
||
|
{
|
||
|
if (manager == null)
|
||
|
throw new ArgumentNullException("manager");
|
||
|
if (obj == null)
|
||
|
throw new ArgumentNullException("obj");
|
||
|
|
||
|
CodeExpression retVal = null;
|
||
|
CodeStatementCollection statements = manager.Context[typeof(CodeStatementCollection)] as CodeStatementCollection;
|
||
|
System.Diagnostics.Debug.Assert(statements != null);
|
||
|
if (statements != null)
|
||
|
{
|
||
|
Activity activity = (Activity)manager.Context[typeof(Activity)];
|
||
|
CodeExpression objectExpression = SerializeToExpression(manager, activity);
|
||
|
ICollection<String> handles = obj as ICollection<String>;
|
||
|
if (handles == null)
|
||
|
throw new ArgumentException(SR.GetString(SR.Error_UnexpectedArgumentType, typeof(StringCollection).FullName), "obj");
|
||
|
|
||
|
string variableName = GetUniqueName(manager, new StringCollection());
|
||
|
statements.Add(new CodeVariableDeclarationStatement(obj.GetType(), variableName, new CodeObjectCreateExpression(obj.GetType())));
|
||
|
|
||
|
foreach (string handle in handles)
|
||
|
statements.Add(new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeVariableReferenceExpression(variableName), "Add"), new CodeExpression[] { new CodePrimitiveExpression(handle) }));
|
||
|
|
||
|
retVal = new CodeVariableReferenceExpression(variableName);
|
||
|
}
|
||
|
return retVal;
|
||
|
}
|
||
|
}
|
||
|
}
|