Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Runtime / Serialization / ObjectCloneHelper.cs / 1305376 / ObjectCloneHelper.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: ObjectCloneHelper ** ** ** Purpose: Helper methods used by ObjectClone to process ISerializable objects etc ** ** ===========================================================*/ #if FEATURE_REMOTING namespace System.Runtime.Serialization { using System.Runtime.Remoting; using System.Runtime.Remoting.Proxies; using System.Runtime.Remoting.Messaging; using System.Runtime.Serialization; using System; using System.Collections; using System.Reflection; using System.Diagnostics; using System.Globalization; internal sealed class ObjectCloneHelper { static IFormatterConverter s_converter = new FormatterConverter(); // Currently object cloner is used only to clone stuff across domains. If its used to clone objects within a domain // the Clone context will need to be created too.. static StreamingContext s_cloneContext = new StreamingContext(StreamingContextStates.CrossAppDomain); static ISerializationSurrogate s_RemotingSurrogate = new RemotingSurrogate(); static ISerializationSurrogate s_ObjRefRemotingSurrogate = new ObjRefSurrogate(); [System.Security.SecurityCritical] // auto-generated internal static object GetObjectData(object serObj, out string typeName, out string assemName, out string[] fieldNames, out object[] fieldValues) { Type objectType = null; object retObj = null; if (RemotingServices.IsTransparentProxy(serObj)) objectType = typeof(MarshalByRefObject); else objectType = serObj.GetType(); SerializationInfo si = new SerializationInfo(objectType, s_converter); if (serObj is ObjRef) { s_ObjRefRemotingSurrogate.GetObjectData(serObj, si, s_cloneContext); } else if (RemotingServices.IsTransparentProxy(serObj) || serObj is MarshalByRefObject) { // We can only try to smuggle objref's for actual CLR objects // or for RemotingProxy's. if (!RemotingServices.IsTransparentProxy(serObj) || RemotingServices.GetRealProxy(serObj) is RemotingProxy) { ObjRef objRef = RemotingServices.MarshalInternal((MarshalByRefObject)serObj, null, null); if (objRef.CanSmuggle()) { if (RemotingServices.IsTransparentProxy(serObj)) { RealProxy rp = RemotingServices.GetRealProxy(serObj); objRef.SetServerIdentity(rp._srvIdentity); objRef.SetDomainID(rp._domainID); } else { ServerIdentity srvId = (ServerIdentity)MarshalByRefObject.GetIdentity((MarshalByRefObject)serObj); srvId.SetHandle(); objRef.SetServerIdentity(srvId.GetHandle()); objRef.SetDomainID(AppDomain.CurrentDomain.GetId()); } objRef.SetMarshaledObject(); retObj = objRef; } } if (retObj == null) { // Deal with the non-smugglable remoting objects s_RemotingSurrogate.GetObjectData(serObj, si, s_cloneContext); } } else if (serObj is ISerializable) { ((ISerializable)serObj).GetObjectData(si, s_cloneContext); } else { // Getting here means a bug in cloner throw new ArgumentException(Environment.GetResourceString("Arg_SerializationException")); } if (retObj == null) { typeName = si.FullTypeName; assemName = si.AssemblyName; fieldNames = si.MemberNames; fieldValues = si.MemberValues; } else { typeName = null; assemName = null; fieldNames = null; fieldValues = null; } return retObj; } [System.Security.SecurityCritical] // auto-generated internal static SerializationInfo PrepareConstructorArgs(object serObj, string[] fieldNames, object[] fieldValues, out StreamingContext context) { SerializationInfo si = null; if (serObj is ISerializable) { si = new SerializationInfo(serObj.GetType(), s_converter); for (int i =0; i < fieldNames.Length; i++) { if (fieldNames[i] != null) si.AddValue(fieldNames[i], fieldValues[i]); } } else { // We have a case where the from object was ISerializable and to object is not // @ Hashtable fields = new Hashtable(); int incomingFieldIndex = 0; int numIncomingFields = 0; for (; incomingFieldIndex < fieldNames.Length; incomingFieldIndex++) { if (fieldNames[incomingFieldIndex] != null) { fields[fieldNames[incomingFieldIndex]] = fieldValues[incomingFieldIndex]; numIncomingFields++; } } MemberInfo[] mi = FormatterServices.GetSerializableMembers(serObj.GetType()); for (int index = 0; index < mi.Length; index++) { string fieldName = mi[index].Name; if (!fields.Contains(fieldName)) { // If we are missing a field value then it's not necessarily // the end of the world: check whether the field is marked // [OptionalField]. Object [] attrs = mi[index].GetCustomAttributes(typeof(OptionalFieldAttribute), false); if (attrs == null || attrs.Length == 0) throw new SerializationException(Environment.GetResourceString("Serialization_MissingMember", mi[index], serObj.GetType(), typeof(OptionalFieldAttribute).FullName)); continue; } object value = fields[fieldName]; FormatterServices.SerializationSetValue(mi[index], serObj, value); } } context = s_cloneContext; return si; } } } #endif // FEATURE_REMOTING // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: ObjectCloneHelper ** ** ** Purpose: Helper methods used by ObjectClone to process ISerializable objects etc ** ** ===========================================================*/ #if FEATURE_REMOTING namespace System.Runtime.Serialization { using System.Runtime.Remoting; using System.Runtime.Remoting.Proxies; using System.Runtime.Remoting.Messaging; using System.Runtime.Serialization; using System; using System.Collections; using System.Reflection; using System.Diagnostics; using System.Globalization; internal sealed class ObjectCloneHelper { static IFormatterConverter s_converter = new FormatterConverter(); // Currently object cloner is used only to clone stuff across domains. If its used to clone objects within a domain // the Clone context will need to be created too.. static StreamingContext s_cloneContext = new StreamingContext(StreamingContextStates.CrossAppDomain); static ISerializationSurrogate s_RemotingSurrogate = new RemotingSurrogate(); static ISerializationSurrogate s_ObjRefRemotingSurrogate = new ObjRefSurrogate(); [System.Security.SecurityCritical] // auto-generated internal static object GetObjectData(object serObj, out string typeName, out string assemName, out string[] fieldNames, out object[] fieldValues) { Type objectType = null; object retObj = null; if (RemotingServices.IsTransparentProxy(serObj)) objectType = typeof(MarshalByRefObject); else objectType = serObj.GetType(); SerializationInfo si = new SerializationInfo(objectType, s_converter); if (serObj is ObjRef) { s_ObjRefRemotingSurrogate.GetObjectData(serObj, si, s_cloneContext); } else if (RemotingServices.IsTransparentProxy(serObj) || serObj is MarshalByRefObject) { // We can only try to smuggle objref's for actual CLR objects // or for RemotingProxy's. if (!RemotingServices.IsTransparentProxy(serObj) || RemotingServices.GetRealProxy(serObj) is RemotingProxy) { ObjRef objRef = RemotingServices.MarshalInternal((MarshalByRefObject)serObj, null, null); if (objRef.CanSmuggle()) { if (RemotingServices.IsTransparentProxy(serObj)) { RealProxy rp = RemotingServices.GetRealProxy(serObj); objRef.SetServerIdentity(rp._srvIdentity); objRef.SetDomainID(rp._domainID); } else { ServerIdentity srvId = (ServerIdentity)MarshalByRefObject.GetIdentity((MarshalByRefObject)serObj); srvId.SetHandle(); objRef.SetServerIdentity(srvId.GetHandle()); objRef.SetDomainID(AppDomain.CurrentDomain.GetId()); } objRef.SetMarshaledObject(); retObj = objRef; } } if (retObj == null) { // Deal with the non-smugglable remoting objects s_RemotingSurrogate.GetObjectData(serObj, si, s_cloneContext); } } else if (serObj is ISerializable) { ((ISerializable)serObj).GetObjectData(si, s_cloneContext); } else { // Getting here means a bug in cloner throw new ArgumentException(Environment.GetResourceString("Arg_SerializationException")); } if (retObj == null) { typeName = si.FullTypeName; assemName = si.AssemblyName; fieldNames = si.MemberNames; fieldValues = si.MemberValues; } else { typeName = null; assemName = null; fieldNames = null; fieldValues = null; } return retObj; } [System.Security.SecurityCritical] // auto-generated internal static SerializationInfo PrepareConstructorArgs(object serObj, string[] fieldNames, object[] fieldValues, out StreamingContext context) { SerializationInfo si = null; if (serObj is ISerializable) { si = new SerializationInfo(serObj.GetType(), s_converter); for (int i =0; i < fieldNames.Length; i++) { if (fieldNames[i] != null) si.AddValue(fieldNames[i], fieldValues[i]); } } else { // We have a case where the from object was ISerializable and to object is not // @ Hashtable fields = new Hashtable(); int incomingFieldIndex = 0; int numIncomingFields = 0; for (; incomingFieldIndex < fieldNames.Length; incomingFieldIndex++) { if (fieldNames[incomingFieldIndex] != null) { fields[fieldNames[incomingFieldIndex]] = fieldValues[incomingFieldIndex]; numIncomingFields++; } } MemberInfo[] mi = FormatterServices.GetSerializableMembers(serObj.GetType()); for (int index = 0; index < mi.Length; index++) { string fieldName = mi[index].Name; if (!fields.Contains(fieldName)) { // If we are missing a field value then it's not necessarily // the end of the world: check whether the field is marked // [OptionalField]. Object [] attrs = mi[index].GetCustomAttributes(typeof(OptionalFieldAttribute), false); if (attrs == null || attrs.Length == 0) throw new SerializationException(Environment.GetResourceString("Serialization_MissingMember", mi[index], serObj.GetType(), typeof(OptionalFieldAttribute).FullName)); continue; } object value = fields[fieldName]; FormatterServices.SerializationSetValue(mi[index], serObj, value); } } context = s_cloneContext; return si; } } } #endif // FEATURE_REMOTING // 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
- TextPatternIdentifiers.cs
- EdmItemCollection.cs
- IconHelper.cs
- DataBindingExpressionBuilder.cs
- AnnotationComponentChooser.cs
- DataPagerFieldCommandEventArgs.cs
- ToolStripRenderEventArgs.cs
- CustomErrorCollection.cs
- EventLogTraceListener.cs
- ToolTipAutomationPeer.cs
- StructuredTypeInfo.cs
- Activator.cs
- IntranetCredentialPolicy.cs
- SettingsPropertyIsReadOnlyException.cs
- ItemCheckedEvent.cs
- ExpressionConverter.cs
- PrintDialogException.cs
- ServiceModelSecurityTokenTypes.cs
- IgnoreFlushAndCloseStream.cs
- SchemaExporter.cs
- TextDecoration.cs
- XmlIterators.cs
- LinearQuaternionKeyFrame.cs
- Triangle.cs
- CodeTypeMemberCollection.cs
- DesignerCategoryAttribute.cs
- HyperLinkField.cs
- ConstraintStruct.cs
- ColorBlend.cs
- XPathSelectionIterator.cs
- PackageRelationshipCollection.cs
- ExpressionBindings.cs
- WindowInteropHelper.cs
- DataListItemCollection.cs
- DataSourceXmlSerializer.cs
- ComplexType.cs
- AnimationTimeline.cs
- PageContentCollection.cs
- PerformanceCounterManager.cs
- SqlClientWrapperSmiStreamChars.cs
- shaperfactoryquerycachekey.cs
- shaperfactory.cs
- PaperSource.cs
- TableCell.cs
- WebPageTraceListener.cs
- ImportCatalogPart.cs
- ManipulationInertiaStartingEventArgs.cs
- sqlser.cs
- SchemaImporter.cs
- StringSource.cs
- List.cs
- ListViewGroup.cs
- MemoryMappedFile.cs
- embossbitmapeffect.cs
- ModifierKeysConverter.cs
- BaseComponentEditor.cs
- EntityDataSourceEntityTypeFilterItem.cs
- EventProviderWriter.cs
- FormatControl.cs
- DataFieldEditor.cs
- DataServiceRequestException.cs
- PipelineModuleStepContainer.cs
- ClientConfigPaths.cs
- IdnElement.cs
- LinkLabelLinkClickedEvent.cs
- CheckPair.cs
- DataTable.cs
- WhereQueryOperator.cs
- ButtonBaseAutomationPeer.cs
- BoundPropertyEntry.cs
- BaseDataBoundControl.cs
- TextModifierScope.cs
- TrustManagerPromptUI.cs
- CultureData.cs
- TimeStampChecker.cs
- XPathArrayIterator.cs
- ProjectionNode.cs
- DataGridTextBoxColumn.cs
- UserControl.cs
- Int64Converter.cs
- FunctionNode.cs
- GeometryModel3D.cs
- UInt16Storage.cs
- HMACSHA256.cs
- TypeSystemProvider.cs
- BuildProviderCollection.cs
- TextBlock.cs
- PolicyImporterElementCollection.cs
- ControlPager.cs
- VisualBasicValue.cs
- PointAnimationUsingKeyFrames.cs
- Parameter.cs
- SmiConnection.cs
- BindingContext.cs
- StandardCommands.cs
- WebPartAuthorizationEventArgs.cs
- BamlLocalizableResourceKey.cs
- cookieexception.cs
- MultipleViewProviderWrapper.cs
- PointKeyFrameCollection.cs