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
- OpenTypeLayout.cs
- UnitySerializationHolder.cs
- CounterCreationData.cs
- MultiAsyncResult.cs
- PolicyException.cs
- ProxyWebPartManager.cs
- TemplatedAdorner.cs
- Events.cs
- AnnotationComponentChooser.cs
- PolygonHotSpot.cs
- InvokeProviderWrapper.cs
- DrawToolTipEventArgs.cs
- ConnectionStringsExpressionEditor.cs
- XsltSettings.cs
- XPathNodeInfoAtom.cs
- DynamicDataRouteHandler.cs
- DataSourceHelper.cs
- XmlImplementation.cs
- UIPermission.cs
- printdlgexmarshaler.cs
- RelationshipType.cs
- TrackingServices.cs
- ToolStripPanelCell.cs
- OracleColumn.cs
- TextUtf8RawTextWriter.cs
- Decorator.cs
- HMACSHA384.cs
- PnrpPermission.cs
- CacheForPrimitiveTypes.cs
- WebPartZoneBase.cs
- Win32.cs
- HelpProvider.cs
- StringCollection.cs
- WpfPayload.cs
- TableRowCollection.cs
- KnownBoxes.cs
- ThrowHelper.cs
- ProjectionAnalyzer.cs
- TableHeaderCell.cs
- ContainerTracking.cs
- AspNetPartialTrustHelpers.cs
- DataSource.cs
- RTLAwareMessageBox.cs
- CustomTypeDescriptor.cs
- Typography.cs
- XmlSchemaGroupRef.cs
- XmlSchemaSimpleContentRestriction.cs
- FontTypeConverter.cs
- GlyphElement.cs
- FileSystemEventArgs.cs
- WS2007FederationHttpBinding.cs
- EntityDataSourceWizardForm.cs
- DllNotFoundException.cs
- Vertex.cs
- GenericTypeParameterBuilder.cs
- XmlQueryOutput.cs
- MetadataAssemblyHelper.cs
- ExternalCalls.cs
- MissingManifestResourceException.cs
- SQLInt32.cs
- CustomAttribute.cs
- MemberInfoSerializationHolder.cs
- CustomAttribute.cs
- VarInfo.cs
- Thumb.cs
- ErrorView.xaml.cs
- NetStream.cs
- baseaxisquery.cs
- SoapInteropTypes.cs
- CalendarData.cs
- SignatureHelper.cs
- FontStyles.cs
- AssemblyResourceLoader.cs
- LocationReferenceEnvironment.cs
- SqlConnectionPoolProviderInfo.cs
- CaseExpr.cs
- PartialCachingControl.cs
- TextMetrics.cs
- OLEDB_Util.cs
- DataObject.cs
- RSAOAEPKeyExchangeFormatter.cs
- DecimalConstantAttribute.cs
- StrokeNodeOperations.cs
- GridItemPattern.cs
- TrackBarRenderer.cs
- ResourceSet.cs
- User.cs
- ErrorProvider.cs
- ILGen.cs
- FileSystemInfo.cs
- XMLDiffLoader.cs
- Encoder.cs
- BitmapSizeOptions.cs
- SortableBindingList.cs
- CodeArrayIndexerExpression.cs
- HttpCapabilitiesEvaluator.cs
- ThreadLocal.cs
- FileVersionInfo.cs
- RandomDelayQueuedSendsAsyncResult.cs
- PageHandlerFactory.cs