Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Common / AuthoringOM / Serializer / DictionarySurrogate.cs / 1305376 / DictionarySurrogate.cs
namespace System.Workflow.ComponentModel.Serialization { using System; using System.Xml; using System.Runtime.Serialization; using System.Reflection; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Collections; using System.Collections.Generic; #region DictionarySurrogate internal sealed class DictionarySurrogate : ISerializationSurrogate { void ISerializationSurrogate.GetObjectData(object obj, SerializationInfo info, StreamingContext context) { if (!obj.GetType().IsGenericType || obj.GetType().GetGenericTypeDefinition() != typeof(Dictionary<,>)) throw new ArgumentException(SR.GetString(SR.Error_InvalidArgumentValue), "obj"); Type[] args = obj.GetType().GetGenericArguments(); if (args.Length != 2) throw new ArgumentException(SR.GetString(SR.Error_InvalidArgumentValue), "obj"); PropertyInfo keysProperty = obj.GetType().GetProperty("Keys"); if (keysProperty == null) throw new NullReferenceException("keysProperty"); ArrayList keys = new ArrayList(keysProperty.GetValue(obj, null) as ICollection); PropertyInfo valuesProperty = obj.GetType().GetProperty("Values"); if (valuesProperty == null) throw new NullReferenceException("valuesProperty"); ArrayList values = new ArrayList(valuesProperty.GetValue(obj, null) as ICollection); if (keys.Count == 1) { info.AddValue("key", keys[0]); info.AddValue("value", values[0]); } else if (keys.Count > 1) { info.AddValue("keys", keys.ToArray()); info.AddValue("values", values.ToArray()); } info.AddValue("keyType", args[0]); info.AddValue("valueType", args[1]); info.SetType(typeof(DictionaryRef)); } object ISerializationSurrogate.SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) { return null; } #region DictionaryRef [Serializable] private sealed class DictionaryRef : IObjectReference, IDeserializationCallback { [OptionalField] private IList keys = null; [OptionalField] private IList values = null; [OptionalField] private object key = null; [OptionalField] private object value = null; private Type keyType = null; private Type valueType = null; [NonSerialized] private object dictionary = null; Object IObjectReference.GetRealObject(StreamingContext context) { if (this.dictionary == null) { Type dictionaryType = typeof(Dictionary).GetGenericTypeDefinition().MakeGenericType(keyType, valueType); this.dictionary = dictionaryType.GetConstructor(Type.EmptyTypes).Invoke(null); } return this.dictionary; } void IDeserializationCallback.OnDeserialization(Object sender) { if (this.dictionary != null) { MethodInfo addMethod = this.dictionary.GetType().GetMethod("Add"); if (addMethod == null) throw new NullReferenceException("addMethod"); object[] kvp = new object[2]; if (this.keys != null) { for (int index = 0; index < this.keys.Count; index++) { kvp[0] = this.keys[index]; kvp[1] = this.values[index]; addMethod.Invoke(this.dictionary, kvp); } } else if (this.key != null) { kvp[0] = this.key; kvp[1] = this.value; addMethod.Invoke(this.dictionary, kvp); } } this.dictionary = null; } } #endregion } #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.Xml; using System.Runtime.Serialization; using System.Reflection; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Collections; using System.Collections.Generic; #region DictionarySurrogate internal sealed class DictionarySurrogate : ISerializationSurrogate { void ISerializationSurrogate.GetObjectData(object obj, SerializationInfo info, StreamingContext context) { if (!obj.GetType().IsGenericType || obj.GetType().GetGenericTypeDefinition() != typeof(Dictionary<,>)) throw new ArgumentException(SR.GetString(SR.Error_InvalidArgumentValue), "obj"); Type[] args = obj.GetType().GetGenericArguments(); if (args.Length != 2) throw new ArgumentException(SR.GetString(SR.Error_InvalidArgumentValue), "obj"); PropertyInfo keysProperty = obj.GetType().GetProperty("Keys"); if (keysProperty == null) throw new NullReferenceException("keysProperty"); ArrayList keys = new ArrayList(keysProperty.GetValue(obj, null) as ICollection); PropertyInfo valuesProperty = obj.GetType().GetProperty("Values"); if (valuesProperty == null) throw new NullReferenceException("valuesProperty"); ArrayList values = new ArrayList(valuesProperty.GetValue(obj, null) as ICollection); if (keys.Count == 1) { info.AddValue("key", keys[0]); info.AddValue("value", values[0]); } else if (keys.Count > 1) { info.AddValue("keys", keys.ToArray()); info.AddValue("values", values.ToArray()); } info.AddValue("keyType", args[0]); info.AddValue("valueType", args[1]); info.SetType(typeof(DictionaryRef)); } object ISerializationSurrogate.SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) { return null; } #region DictionaryRef [Serializable] private sealed class DictionaryRef : IObjectReference, IDeserializationCallback { [OptionalField] private IList keys = null; [OptionalField] private IList values = null; [OptionalField] private object key = null; [OptionalField] private object value = null; private Type keyType = null; private Type valueType = null; [NonSerialized] private object dictionary = null; Object IObjectReference.GetRealObject(StreamingContext context) { if (this.dictionary == null) { Type dictionaryType = typeof(Dictionary ).GetGenericTypeDefinition().MakeGenericType(keyType, valueType); this.dictionary = dictionaryType.GetConstructor(Type.EmptyTypes).Invoke(null); } return this.dictionary; } void IDeserializationCallback.OnDeserialization(Object sender) { if (this.dictionary != null) { MethodInfo addMethod = this.dictionary.GetType().GetMethod("Add"); if (addMethod == null) throw new NullReferenceException("addMethod"); object[] kvp = new object[2]; if (this.keys != null) { for (int index = 0; index < this.keys.Count; index++) { kvp[0] = this.keys[index]; kvp[1] = this.values[index]; addMethod.Invoke(this.dictionary, kvp); } } else if (this.key != null) { kvp[0] = this.key; kvp[1] = this.value; addMethod.Invoke(this.dictionary, kvp); } } this.dictionary = null; } } #endregion } #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
- UpdatePanelControlTrigger.cs
- WebPartAddingEventArgs.cs
- PersonalizationStateInfoCollection.cs
- PropertyNames.cs
- SingleQueryOperator.cs
- WebHttpSecurityModeHelper.cs
- DocumentGridContextMenu.cs
- GridPatternIdentifiers.cs
- OuterGlowBitmapEffect.cs
- HtmlHistory.cs
- RemoteWebConfigurationHostStream.cs
- DCSafeHandle.cs
- AxisAngleRotation3D.cs
- SoapHeader.cs
- BuildProvider.cs
- NumberAction.cs
- EntityDataSourceWrapperCollection.cs
- MissingManifestResourceException.cs
- HttpPostProtocolReflector.cs
- Console.cs
- SeverityFilter.cs
- AsyncPostBackErrorEventArgs.cs
- DbConnectionFactory.cs
- SqlRewriteScalarSubqueries.cs
- CheckBoxDesigner.cs
- JoinGraph.cs
- SchemaImporterExtension.cs
- SyndicationCategory.cs
- Propagator.Evaluator.cs
- SizeFConverter.cs
- ScriptComponentDescriptor.cs
- JournalEntry.cs
- TextEditorLists.cs
- FixedSOMLineCollection.cs
- X509Certificate2.cs
- SelectQueryOperator.cs
- SectionUpdates.cs
- ValueQuery.cs
- HelloMessageApril2005.cs
- OperandQuery.cs
- XmlAttribute.cs
- GlyphRunDrawing.cs
- FixedDocumentPaginator.cs
- PixelShader.cs
- GlyphTypeface.cs
- MetafileEditor.cs
- Version.cs
- EntityKey.cs
- HandledMouseEvent.cs
- DocumentsTrace.cs
- CodeDomConfigurationHandler.cs
- Baml2006ReaderFrame.cs
- FrameworkElementFactory.cs
- CloudCollection.cs
- ScrollViewer.cs
- Evidence.cs
- StringDictionaryWithComparer.cs
- Rules.cs
- MatrixConverter.cs
- Pkcs7Recipient.cs
- MessageDecoder.cs
- AnnotationHighlightLayer.cs
- Compiler.cs
- DocumentOrderQuery.cs
- FormsAuthenticationUserCollection.cs
- SortedList.cs
- TableColumn.cs
- ButtonChrome.cs
- CodeAttributeArgumentCollection.cs
- Int16AnimationBase.cs
- ProfileGroupSettings.cs
- DesignerActionKeyboardBehavior.cs
- TiffBitmapEncoder.cs
- AsmxEndpointPickerExtension.cs
- MappingMetadataHelper.cs
- OdbcFactory.cs
- DataComponentNameHandler.cs
- Rotation3D.cs
- WebDisplayNameAttribute.cs
- ToolBarTray.cs
- PagesSection.cs
- WinFormsSecurity.cs
- StringConverter.cs
- SessionStateItemCollection.cs
- CatalogPartCollection.cs
- FileDataSourceCache.cs
- TextEditorCopyPaste.cs
- EnumConverter.cs
- InternalBase.cs
- UrlRoutingModule.cs
- HandlerFactoryWrapper.cs
- WizardPanel.cs
- DocumentGridPage.cs
- SystemWebExtensionsSectionGroup.cs
- XmlTypeAttribute.cs
- HttpApplicationStateBase.cs
- StrokeIntersection.cs
- DataViewListener.cs
- ConfigurationLocationCollection.cs
- ListBoxAutomationPeer.cs