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
- PointAnimation.cs
- SystemIPInterfaceStatistics.cs
- SearchForVirtualItemEventArgs.cs
- DynamicILGenerator.cs
- UpDownEvent.cs
- CustomErrorsSectionWrapper.cs
- ObjectListGeneralPage.cs
- View.cs
- EndpointAddressMessageFilter.cs
- DerivedKeyCachingSecurityTokenSerializer.cs
- SqlProvider.cs
- SapiInterop.cs
- ListViewPagedDataSource.cs
- OleDbCommand.cs
- ImageFormat.cs
- WebMessageEncodingBindingElement.cs
- UriWriter.cs
- MetaModel.cs
- DateTimeUtil.cs
- ITreeGenerator.cs
- xdrvalidator.cs
- SoapServerMessage.cs
- WindowsIdentity.cs
- XmlDocumentSchema.cs
- MinMaxParagraphWidth.cs
- CodeLinePragma.cs
- SpecularMaterial.cs
- NumberFunctions.cs
- _LocalDataStoreMgr.cs
- DataGridViewRowErrorTextNeededEventArgs.cs
- HandlerBase.cs
- MasterPageCodeDomTreeGenerator.cs
- ContentDesigner.cs
- StringAnimationBase.cs
- TransformerInfo.cs
- ObjectDataSourceChooseTypePanel.cs
- xmlsaver.cs
- Directory.cs
- XamlTreeBuilderBamlRecordWriter.cs
- BindableTemplateBuilder.cs
- SystemException.cs
- Italic.cs
- dbdatarecord.cs
- DataBindingExpressionBuilder.cs
- ContextActivityUtils.cs
- DataServiceQuery.cs
- EntitySetBaseCollection.cs
- UserThread.cs
- WindowsComboBox.cs
- ScalarType.cs
- UrlAuthorizationModule.cs
- ExternalException.cs
- JournalEntryStack.cs
- Avt.cs
- Memoizer.cs
- DataDesignUtil.cs
- FullTextBreakpoint.cs
- ScriptReferenceBase.cs
- XmlNodeComparer.cs
- EmptyEnumerable.cs
- TransformValueSerializer.cs
- TextRangeEdit.cs
- XamlReaderHelper.cs
- _IPv4Address.cs
- UInt32Storage.cs
- Int64KeyFrameCollection.cs
- DictionaryEntry.cs
- InkCanvasFeedbackAdorner.cs
- ClientSponsor.cs
- ControlBindingsConverter.cs
- DesignTimeDataBinding.cs
- CodeEventReferenceExpression.cs
- XmlIgnoreAttribute.cs
- Attributes.cs
- PerformanceCounterManager.cs
- ISAPIApplicationHost.cs
- Point.cs
- RegexStringValidator.cs
- Pts.cs
- StringReader.cs
- TabItemAutomationPeer.cs
- IndexingContentUnit.cs
- InternalMappingException.cs
- SchemaCollectionPreprocessor.cs
- DataTableExtensions.cs
- DragEvent.cs
- Filter.cs
- CompilationUnit.cs
- CheckBoxPopupAdapter.cs
- ListMarkerSourceInfo.cs
- WindowsFormsSectionHandler.cs
- StackOverflowException.cs
- DelegateSerializationHolder.cs
- Track.cs
- DataError.cs
- PngBitmapEncoder.cs
- ExpandSegment.cs
- StoreAnnotationsMap.cs
- DesignerHelpers.cs
- ISAPIWorkerRequest.cs