Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DrawingCollection.cs
- TypeValidationEventArgs.cs
- HtmlElementEventArgs.cs
- LocalizationParserHooks.cs
- CompositeCollection.cs
- EventProviderBase.cs
- XmlElementAttribute.cs
- ComboBox.cs
- PassportAuthenticationEventArgs.cs
- PageEventArgs.cs
- CharConverter.cs
- BaseCAMarshaler.cs
- OutKeywords.cs
- Win32NamedPipes.cs
- SystemIcmpV6Statistics.cs
- WebPartUserCapability.cs
- DoubleLink.cs
- DirectionalLight.cs
- DownloadProgressEventArgs.cs
- ExceptionHandlers.cs
- TriggerAction.cs
- APCustomTypeDescriptor.cs
- RequestUriProcessor.cs
- CollectionDataContract.cs
- CodeDelegateInvokeExpression.cs
- HwndStylusInputProvider.cs
- SystemInfo.cs
- COM2ExtendedTypeConverter.cs
- PersonalizationAdministration.cs
- Semaphore.cs
- HttpCacheVary.cs
- BaseAsyncResult.cs
- ConfigurationSettings.cs
- ToolStripOverflowButton.cs
- RuleSettingsCollection.cs
- RowVisual.cs
- ObjectTypeMapping.cs
- ServiceEndpointAssociationProvider.cs
- AutomationPeer.cs
- ClassGenerator.cs
- SimpleBitVector32.cs
- SafeNativeMemoryHandle.cs
- OdbcConnectionFactory.cs
- BackgroundWorker.cs
- PropertySegmentSerializer.cs
- AttachedPropertyBrowsableForChildrenAttribute.cs
- Array.cs
- CngKeyBlobFormat.cs
- VariantWrapper.cs
- WindowShowOrOpenTracker.cs
- StorageMappingItemLoader.cs
- DynamicActionMessageFilter.cs
- RegexNode.cs
- FilteredReadOnlyMetadataCollection.cs
- RecordConverter.cs
- MouseGestureConverter.cs
- ParamArrayAttribute.cs
- PartialList.cs
- ComponentEvent.cs
- HtmlTextArea.cs
- SQLInt16.cs
- KeyValuePairs.cs
- TypePresenter.xaml.cs
- Currency.cs
- JobDuplex.cs
- JavaScriptSerializer.cs
- BoolExpr.cs
- DoubleConverter.cs
- ReadOnlyCollectionBuilder.cs
- SharedDp.cs
- ColorTransform.cs
- EtwTrace.cs
- Parser.cs
- FileVersion.cs
- RequestCachePolicy.cs
- DataGridCell.cs
- SqlCacheDependency.cs
- WebConvert.cs
- HiddenFieldPageStatePersister.cs
- ProgressiveCrcCalculatingStream.cs
- TextUtf8RawTextWriter.cs
- ExpressionBinding.cs
- SafeHandles.cs
- TabItemAutomationPeer.cs
- UserControl.cs
- StorageModelBuildProvider.cs
- input.cs
- Image.cs
- TreeNode.cs
- HtmlTitle.cs
- ProxyWebPartManager.cs
- MessageDesigner.cs
- RijndaelManagedTransform.cs
- ValueType.cs
- XmlAttributeOverrides.cs
- ImageFormatConverter.cs
- InstanceOwner.cs
- ClientOptions.cs
- ExtractorMetadata.cs
- ShaderEffect.cs