Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Runtime / Serialization / SerializationEventsCache.cs / 1407647 / SerializationEventsCache.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: SerializationEventsCache ** ** ** Purpose: Caches the various serialization events such as On(De)Seriliz(ed)ing ** ** ============================================================*/ namespace System.Runtime.Serialization { using System; using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Reflection.Cache; using System.Globalization; using System.Diagnostics.Contracts; internal class SerializationEvents { private Listm_OnSerializingMethods = null; private List m_OnSerializedMethods = null; private List m_OnDeserializingMethods = null; private List m_OnDeserializedMethods = null; private List GetMethodsWithAttribute(Type attribute, Type t) { List mi = new List (); Type baseType = t; // Traverse the hierarchy to find all methods with the particular attribute while (baseType != null && baseType != typeof(Object)) { RuntimeType rt = (RuntimeType)baseType; // Get all methods which are declared on this type, instance and public or nonpublic MethodInfo[] mis = baseType.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); #if _DEBUG bool found = false; #endif foreach(MethodInfo m in mis) { // For each method find if attribute is present, the return type is void and the method is not virtual if (m.IsDefined(attribute, false)) { #if _DEBUG Contract.Assert(m.ReturnType == typeof(void) && !m.IsVirtual, "serialization events methods cannot be virtual and need to have void return"); ParameterInfo[] paramInfo = m.GetParameters(); // Only add it if this method has one parameter of type StreamingContext if (paramInfo.Length == 1 && paramInfo[0].ParameterType == typeof(StreamingContext)) { if (found) Contract.Assert(false, "Mutliple methods with same serialization attribute"); #endif mi.Add(m); #if _DEBUG found = true; } else Contract.Assert(false, "Incorrect serialization event signature"); #endif } } #if _DEBUG found = false; #endif baseType = baseType.BaseType; } mi.Reverse(); // We should invoke the methods starting from base return (mi.Count == 0) ? null : mi; } internal SerializationEvents(Type t) { // Initialize all events m_OnSerializingMethods = GetMethodsWithAttribute(typeof(OnSerializingAttribute), t); m_OnSerializedMethods = GetMethodsWithAttribute(typeof(OnSerializedAttribute), t); m_OnDeserializingMethods = GetMethodsWithAttribute(typeof(OnDeserializingAttribute), t); m_OnDeserializedMethods = GetMethodsWithAttribute(typeof(OnDeserializedAttribute), t); } internal bool HasOnSerializingEvents { get { return m_OnSerializingMethods != null || m_OnSerializedMethods != null; } } internal void InvokeOnSerializing(Object obj, StreamingContext context) { Contract.Assert(obj != null, "object should have been initialized"); // Invoke all OnSerializingMethods if (m_OnSerializingMethods != null) { Object[] p = new Object[] {context}; SerializationEventHandler handler = null; foreach(MethodInfo m in m_OnSerializingMethods) { SerializationEventHandler onSerializing = (SerializationEventHandler)Delegate.InternalCreateDelegate(typeof(SerializationEventHandler), obj, m); handler = (SerializationEventHandler)Delegate.Combine(handler, onSerializing); } handler(context); } } internal void InvokeOnDeserializing(Object obj, StreamingContext context) { Contract.Assert(obj != null, "object should have been initialized"); // Invoke all OnDeserializingMethods if (m_OnDeserializingMethods != null) { Object[] p = new Object[] {context}; SerializationEventHandler handler = null; foreach(MethodInfo m in m_OnDeserializingMethods) { SerializationEventHandler onDeserializing = (SerializationEventHandler)Delegate.InternalCreateDelegate(typeof(SerializationEventHandler), obj, m); handler = (SerializationEventHandler)Delegate.Combine(handler, onDeserializing); } handler(context); } } internal void InvokeOnDeserialized(Object obj, StreamingContext context) { Contract.Assert(obj != null, "object should have been initialized"); // Invoke all OnDeserializingMethods if (m_OnDeserializedMethods != null) { Object[] p = new Object[] {context}; SerializationEventHandler handler = null; foreach(MethodInfo m in m_OnDeserializedMethods) { SerializationEventHandler onDeserialized = (SerializationEventHandler)Delegate.InternalCreateDelegate(typeof(SerializationEventHandler), obj, m); handler = (SerializationEventHandler)Delegate.Combine(handler, onDeserialized); } handler(context); } } internal SerializationEventHandler AddOnSerialized(Object obj, SerializationEventHandler handler) { // Add all OnSerialized methods to a delegate if (m_OnSerializedMethods != null) { foreach(MethodInfo m in m_OnSerializedMethods) { SerializationEventHandler onSerialized = (SerializationEventHandler)Delegate.InternalCreateDelegate(typeof(SerializationEventHandler), obj, m); handler = (SerializationEventHandler)Delegate.Combine(handler, onSerialized); } } return handler; } internal SerializationEventHandler AddOnDeserialized(Object obj, SerializationEventHandler handler) { // Add all OnDeserialized methods to a delegate if (m_OnDeserializedMethods != null) { foreach(MethodInfo m in m_OnDeserializedMethods) { SerializationEventHandler onDeserialized = (SerializationEventHandler)Delegate.InternalCreateDelegate(typeof(SerializationEventHandler), obj, m); handler = (SerializationEventHandler)Delegate.Combine(handler, onDeserialized); } } return handler; } } internal static class SerializationEventsCache { private static Hashtable cache = new Hashtable(); internal static SerializationEvents GetSerializationEventsForType(Type t) { SerializationEvents events; if ((events = (SerializationEvents)cache[t]) == null) { lock(cache.SyncRoot) { if ((events = (SerializationEvents)cache[t]) == null) { events = new SerializationEvents(t); cache[t] = events; // Add this to the cache. } } } return events; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: SerializationEventsCache ** ** ** Purpose: Caches the various serialization events such as On(De)Seriliz(ed)ing ** ** ============================================================*/ namespace System.Runtime.Serialization { using System; using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Reflection.Cache; using System.Globalization; using System.Diagnostics.Contracts; internal class SerializationEvents { private List m_OnSerializingMethods = null; private List m_OnSerializedMethods = null; private List m_OnDeserializingMethods = null; private List m_OnDeserializedMethods = null; private List GetMethodsWithAttribute(Type attribute, Type t) { List mi = new List (); Type baseType = t; // Traverse the hierarchy to find all methods with the particular attribute while (baseType != null && baseType != typeof(Object)) { RuntimeType rt = (RuntimeType)baseType; // Get all methods which are declared on this type, instance and public or nonpublic MethodInfo[] mis = baseType.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); #if _DEBUG bool found = false; #endif foreach(MethodInfo m in mis) { // For each method find if attribute is present, the return type is void and the method is not virtual if (m.IsDefined(attribute, false)) { #if _DEBUG Contract.Assert(m.ReturnType == typeof(void) && !m.IsVirtual, "serialization events methods cannot be virtual and need to have void return"); ParameterInfo[] paramInfo = m.GetParameters(); // Only add it if this method has one parameter of type StreamingContext if (paramInfo.Length == 1 && paramInfo[0].ParameterType == typeof(StreamingContext)) { if (found) Contract.Assert(false, "Mutliple methods with same serialization attribute"); #endif mi.Add(m); #if _DEBUG found = true; } else Contract.Assert(false, "Incorrect serialization event signature"); #endif } } #if _DEBUG found = false; #endif baseType = baseType.BaseType; } mi.Reverse(); // We should invoke the methods starting from base return (mi.Count == 0) ? null : mi; } internal SerializationEvents(Type t) { // Initialize all events m_OnSerializingMethods = GetMethodsWithAttribute(typeof(OnSerializingAttribute), t); m_OnSerializedMethods = GetMethodsWithAttribute(typeof(OnSerializedAttribute), t); m_OnDeserializingMethods = GetMethodsWithAttribute(typeof(OnDeserializingAttribute), t); m_OnDeserializedMethods = GetMethodsWithAttribute(typeof(OnDeserializedAttribute), t); } internal bool HasOnSerializingEvents { get { return m_OnSerializingMethods != null || m_OnSerializedMethods != null; } } internal void InvokeOnSerializing(Object obj, StreamingContext context) { Contract.Assert(obj != null, "object should have been initialized"); // Invoke all OnSerializingMethods if (m_OnSerializingMethods != null) { Object[] p = new Object[] {context}; SerializationEventHandler handler = null; foreach(MethodInfo m in m_OnSerializingMethods) { SerializationEventHandler onSerializing = (SerializationEventHandler)Delegate.InternalCreateDelegate(typeof(SerializationEventHandler), obj, m); handler = (SerializationEventHandler)Delegate.Combine(handler, onSerializing); } handler(context); } } internal void InvokeOnDeserializing(Object obj, StreamingContext context) { Contract.Assert(obj != null, "object should have been initialized"); // Invoke all OnDeserializingMethods if (m_OnDeserializingMethods != null) { Object[] p = new Object[] {context}; SerializationEventHandler handler = null; foreach(MethodInfo m in m_OnDeserializingMethods) { SerializationEventHandler onDeserializing = (SerializationEventHandler)Delegate.InternalCreateDelegate(typeof(SerializationEventHandler), obj, m); handler = (SerializationEventHandler)Delegate.Combine(handler, onDeserializing); } handler(context); } } internal void InvokeOnDeserialized(Object obj, StreamingContext context) { Contract.Assert(obj != null, "object should have been initialized"); // Invoke all OnDeserializingMethods if (m_OnDeserializedMethods != null) { Object[] p = new Object[] {context}; SerializationEventHandler handler = null; foreach(MethodInfo m in m_OnDeserializedMethods) { SerializationEventHandler onDeserialized = (SerializationEventHandler)Delegate.InternalCreateDelegate(typeof(SerializationEventHandler), obj, m); handler = (SerializationEventHandler)Delegate.Combine(handler, onDeserialized); } handler(context); } } internal SerializationEventHandler AddOnSerialized(Object obj, SerializationEventHandler handler) { // Add all OnSerialized methods to a delegate if (m_OnSerializedMethods != null) { foreach(MethodInfo m in m_OnSerializedMethods) { SerializationEventHandler onSerialized = (SerializationEventHandler)Delegate.InternalCreateDelegate(typeof(SerializationEventHandler), obj, m); handler = (SerializationEventHandler)Delegate.Combine(handler, onSerialized); } } return handler; } internal SerializationEventHandler AddOnDeserialized(Object obj, SerializationEventHandler handler) { // Add all OnDeserialized methods to a delegate if (m_OnDeserializedMethods != null) { foreach(MethodInfo m in m_OnDeserializedMethods) { SerializationEventHandler onDeserialized = (SerializationEventHandler)Delegate.InternalCreateDelegate(typeof(SerializationEventHandler), obj, m); handler = (SerializationEventHandler)Delegate.Combine(handler, onDeserialized); } } return handler; } } internal static class SerializationEventsCache { private static Hashtable cache = new Hashtable(); internal static SerializationEvents GetSerializationEventsForType(Type t) { SerializationEvents events; if ((events = (SerializationEvents)cache[t]) == null) { lock(cache.SyncRoot) { if ((events = (SerializationEvents)cache[t]) == null) { events = new SerializationEvents(t); cache[t] = events; // Add this to the cache. } } } return events; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ClassHandlersStore.cs
- XmlNodeChangedEventManager.cs
- OdbcInfoMessageEvent.cs
- CompositeFontInfo.cs
- ArgumentOutOfRangeException.cs
- ObservableCollectionDefaultValueFactory.cs
- COM2ExtendedBrowsingHandler.cs
- XmlSchemaComplexType.cs
- Section.cs
- Stack.cs
- PeerNode.cs
- Point3DAnimationUsingKeyFrames.cs
- PageParser.cs
- AccessibleObject.cs
- StaticDataManager.cs
- ExpressionBuilder.cs
- DataGridViewColumnStateChangedEventArgs.cs
- EntityCommand.cs
- PowerModeChangedEventArgs.cs
- WebEventCodes.cs
- RawUIStateInputReport.cs
- RangeValueProviderWrapper.cs
- RelationshipEndMember.cs
- Rotation3D.cs
- TableDetailsRow.cs
- KernelTypeValidation.cs
- Int32KeyFrameCollection.cs
- BindableTemplateBuilder.cs
- Ops.cs
- PropertyGridDesigner.cs
- XPathSingletonIterator.cs
- ServiceOperation.cs
- HebrewNumber.cs
- BeginGetFileNameFromUserRequest.cs
- SearchForVirtualItemEventArgs.cs
- WebPartManager.cs
- ItemsPanelTemplate.cs
- XhtmlTextWriter.cs
- SqlError.cs
- SqlInfoMessageEvent.cs
- ScaleTransform3D.cs
- SecurityTokenParameters.cs
- MouseGesture.cs
- CopyNodeSetAction.cs
- EntryPointNotFoundException.cs
- SiteMembershipCondition.cs
- AnimationStorage.cs
- COM2Properties.cs
- Invariant.cs
- RegexStringValidator.cs
- OleDbParameter.cs
- ZipIOZip64EndOfCentralDirectoryBlock.cs
- ProfileGroupSettingsCollection.cs
- XmlSchemaComplexType.cs
- StylusPoint.cs
- UserPersonalizationStateInfo.cs
- Parser.cs
- WindowsFormsSynchronizationContext.cs
- Expression.cs
- Transform3DGroup.cs
- TypeNameConverter.cs
- DeclarationUpdate.cs
- EntityTypeBase.cs
- Single.cs
- CompositeDesignerAccessibleObject.cs
- CreatingCookieEventArgs.cs
- Typeface.cs
- RootProfilePropertySettingsCollection.cs
- TitleStyle.cs
- DesignTimeDataBinding.cs
- MonitorWrapper.cs
- DomainUpDown.cs
- XmlSignificantWhitespace.cs
- TextTreeUndoUnit.cs
- AnnotationMap.cs
- AudioDeviceOut.cs
- ShaderEffect.cs
- CachedCompositeFamily.cs
- EntitySetDataBindingList.cs
- Wow64ConfigurationLoader.cs
- SecurityProtocol.cs
- RootBrowserWindow.cs
- BamlResourceSerializer.cs
- WindowShowOrOpenTracker.cs
- TemplateControlParser.cs
- AnnotationComponentChooser.cs
- MulticastDelegate.cs
- RecognizedWordUnit.cs
- XmlDocumentSerializer.cs
- ComboBox.cs
- MetadataItem.cs
- CodeComment.cs
- GifBitmapDecoder.cs
- RegexTypeEditor.cs
- HostedHttpContext.cs
- BinaryNode.cs
- Stacktrace.cs
- SqlConnectionFactory.cs
- VoiceObjectToken.cs
- ToolStripMenuItemDesigner.cs