Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Common / AuthoringOM / Serializer / SerializableTypeCodeDomSerializer.cs / 1305376 / SerializableTypeCodeDomSerializer.cs
namespace System.Workflow.ComponentModel.Serialization { using System; using System.CodeDom; using System.ComponentModel; using System.ComponentModel.Design; using System.ComponentModel.Design.Serialization; using System.Collections; using System.Resources; using System.Workflow.ComponentModel.Design; using System.Collections.Generic; using Microsoft.CSharp; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Compiler; using System.CodeDom.Compiler; using System.IO; using System.Reflection; using System.Diagnostics; #region Class SerializableTypeCodeDomSerializer internal sealed class SerializableTypeCodeDomSerializer : CodeDomSerializer { private CodeDomSerializer originalSerializer; public SerializableTypeCodeDomSerializer(CodeDomSerializer originalSerializer) { if (originalSerializer == null) throw new ArgumentNullException("originalSerializer"); this.originalSerializer = originalSerializer; } public override object Serialize(IDesignerSerializationManager manager, object value) { if (manager == null) throw new ArgumentNullException("manager"); object result = null; if (value == null) return result; CodeStatementCollection statements = null; ExpressionContext cxt = manager.Context[typeof(ExpressionContext)] as ExpressionContext; if (value.GetType().GetConstructor(new Type[0]) != null) { if (value is ICollection) { ExpressionContext varExct = null; if (cxt != null) { if (cxt.PresetValue != value) { try { statements = new CodeStatementCollection(); CodeVariableReferenceExpression varExpression = AddVariableExpression(manager, statements, value); varExct = new ExpressionContext(varExpression, value.GetType(), cxt.Owner, value); manager.Context.Push(varExct); result = this.originalSerializer.Serialize(manager, value); if (result is CodeStatementCollection) statements.AddRange(result as CodeStatementCollection); else if (result is CodeStatement) statements.Add(result as CodeStatement); else if (result is CodeExpression) // If the returned result is an expression, it mostly likely means the collection // can not be serialized using statements, instead it has been serialized as resources. // In this case, we just over-write the variable init expression with the "GetObject" // expression for resource objects. statements.Add(new CodeAssignStatement(varExpression, result as CodeExpression)); result = statements; } finally { if (varExct != null) manager.Context.Pop(); } } else { result = this.originalSerializer.Serialize(manager, value); } } } else { statements = new CodeStatementCollection(); CodeVariableReferenceExpression varExpression = AddVariableExpression(manager, statements, value); SerializeProperties(manager, statements, value, new Attribute[] { DesignOnlyAttribute.No }); SerializeEvents(manager, statements, value, new Attribute[] { DesignOnlyAttribute.No }); result = statements; } } else if (cxt != null) { result = this.originalSerializer.Serialize(manager, value); } return result; } private CodeVariableReferenceExpression AddVariableExpression(IDesignerSerializationManager manager, CodeStatementCollection statements, object value) { string varName = GetUniqueName(manager, value).Replace('`', '_'); CodeVariableDeclarationStatement varDecl = new CodeVariableDeclarationStatement(TypeDescriptor.GetClassName(value), varName); varDecl.InitExpression = new CodeObjectCreateExpression(TypeDescriptor.GetClassName(value), new CodeExpression[0]); ; statements.Add(varDecl); CodeVariableReferenceExpression varExpression = new CodeVariableReferenceExpression(varName); SetExpression(manager, value, varExpression); return varExpression; } } #endregion } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. namespace System.Workflow.ComponentModel.Serialization { using System; using System.CodeDom; using System.ComponentModel; using System.ComponentModel.Design; using System.ComponentModel.Design.Serialization; using System.Collections; using System.Resources; using System.Workflow.ComponentModel.Design; using System.Collections.Generic; using Microsoft.CSharp; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Compiler; using System.CodeDom.Compiler; using System.IO; using System.Reflection; using System.Diagnostics; #region Class SerializableTypeCodeDomSerializer internal sealed class SerializableTypeCodeDomSerializer : CodeDomSerializer { private CodeDomSerializer originalSerializer; public SerializableTypeCodeDomSerializer(CodeDomSerializer originalSerializer) { if (originalSerializer == null) throw new ArgumentNullException("originalSerializer"); this.originalSerializer = originalSerializer; } public override object Serialize(IDesignerSerializationManager manager, object value) { if (manager == null) throw new ArgumentNullException("manager"); object result = null; if (value == null) return result; CodeStatementCollection statements = null; ExpressionContext cxt = manager.Context[typeof(ExpressionContext)] as ExpressionContext; if (value.GetType().GetConstructor(new Type[0]) != null) { if (value is ICollection) { ExpressionContext varExct = null; if (cxt != null) { if (cxt.PresetValue != value) { try { statements = new CodeStatementCollection(); CodeVariableReferenceExpression varExpression = AddVariableExpression(manager, statements, value); varExct = new ExpressionContext(varExpression, value.GetType(), cxt.Owner, value); manager.Context.Push(varExct); result = this.originalSerializer.Serialize(manager, value); if (result is CodeStatementCollection) statements.AddRange(result as CodeStatementCollection); else if (result is CodeStatement) statements.Add(result as CodeStatement); else if (result is CodeExpression) // If the returned result is an expression, it mostly likely means the collection // can not be serialized using statements, instead it has been serialized as resources. // In this case, we just over-write the variable init expression with the "GetObject" // expression for resource objects. statements.Add(new CodeAssignStatement(varExpression, result as CodeExpression)); result = statements; } finally { if (varExct != null) manager.Context.Pop(); } } else { result = this.originalSerializer.Serialize(manager, value); } } } else { statements = new CodeStatementCollection(); CodeVariableReferenceExpression varExpression = AddVariableExpression(manager, statements, value); SerializeProperties(manager, statements, value, new Attribute[] { DesignOnlyAttribute.No }); SerializeEvents(manager, statements, value, new Attribute[] { DesignOnlyAttribute.No }); result = statements; } } else if (cxt != null) { result = this.originalSerializer.Serialize(manager, value); } return result; } private CodeVariableReferenceExpression AddVariableExpression(IDesignerSerializationManager manager, CodeStatementCollection statements, object value) { string varName = GetUniqueName(manager, value).Replace('`', '_'); CodeVariableDeclarationStatement varDecl = new CodeVariableDeclarationStatement(TypeDescriptor.GetClassName(value), varName); varDecl.InitExpression = new CodeObjectCreateExpression(TypeDescriptor.GetClassName(value), new CodeExpression[0]); ; statements.Add(varDecl); CodeVariableReferenceExpression varExpression = new CodeVariableReferenceExpression(varName); SetExpression(manager, value, varExpression); return varExpression; } } #endregion } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DoWhileDesigner.xaml.cs
- PenCursorManager.cs
- PageThemeBuildProvider.cs
- SelectorItemAutomationPeer.cs
- ConditionalExpression.cs
- SQLBytes.cs
- HtmlInputReset.cs
- PageAsyncTaskManager.cs
- ExceptionUtil.cs
- DataControlFieldCell.cs
- ActivityInstanceReference.cs
- Table.cs
- TextServicesContext.cs
- ResourceContainer.cs
- HitTestResult.cs
- PrivilegeNotHeldException.cs
- Brush.cs
- NoClickablePointException.cs
- MetadataProperty.cs
- Page.cs
- TiffBitmapEncoder.cs
- UndirectedGraph.cs
- XPathDocumentIterator.cs
- Speller.cs
- _ShellExpression.cs
- CompensateDesigner.cs
- FontFamily.cs
- MenuAutomationPeer.cs
- Vector3DCollection.cs
- TreeView.cs
- ReachVisualSerializerAsync.cs
- DeflateEmulationStream.cs
- SspiSecurityTokenParameters.cs
- Matrix3DConverter.cs
- BaseHashHelper.cs
- SerializationException.cs
- Int16Storage.cs
- CollectionChangeEventArgs.cs
- ToolStripHighContrastRenderer.cs
- APCustomTypeDescriptor.cs
- SqlDataSourceView.cs
- Rect.cs
- DiscoveryOperationContext.cs
- ResourceDisplayNameAttribute.cs
- XpsSerializationException.cs
- ControlOperationInvoker.cs
- InheritedPropertyDescriptor.cs
- NativeMethods.cs
- AsymmetricKeyExchangeFormatter.cs
- SerializationTrace.cs
- BamlCollectionHolder.cs
- OleAutBinder.cs
- DataMemberConverter.cs
- CodeCompileUnit.cs
- CacheRequest.cs
- DBBindings.cs
- ObjectDataSourceDesigner.cs
- FieldAccessException.cs
- SerializationEventsCache.cs
- WSSecurityXXX2005.cs
- PeerUnsafeNativeMethods.cs
- CollectionChangedEventManager.cs
- XmlText.cs
- TextCompositionManager.cs
- RepeaterItem.cs
- IdnMapping.cs
- TextBoxRenderer.cs
- DataSourceCacheDurationConverter.cs
- uribuilder.cs
- MetadataArtifactLoader.cs
- CompilerTypeWithParams.cs
- ContentElementAutomationPeer.cs
- Italic.cs
- OutputCacheModule.cs
- URLIdentityPermission.cs
- TreeView.cs
- ContainerSelectorBehavior.cs
- RelAssertionDirectKeyIdentifierClause.cs
- RewritingProcessor.cs
- GenericTransactionFlowAttribute.cs
- SqlException.cs
- Vector3D.cs
- SortableBindingList.cs
- TouchPoint.cs
- StylusPointPropertyInfoDefaults.cs
- LinkDesigner.cs
- PipelineModuleStepContainer.cs
- UrlMapping.cs
- ColorTranslator.cs
- mactripleDES.cs
- Single.cs
- Oid.cs
- PageContentAsyncResult.cs
- TypeReference.cs
- IIS7UserPrincipal.cs
- WindowsProgressbar.cs
- RichTextBoxConstants.cs
- DictionaryGlobals.cs
- ThreadInterruptedException.cs
- HebrewCalendar.cs