Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / clr / src / ManagedLibraries / SoapSerializer / SoapObjectInfo.cs / 1 / SoapObjectInfo.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== //============================================================ // // Class: SerObjectInfo //// Author: Peter de Jong ([....]) // // Purpose: Holds information about an objects Members // // Date: September 29, 1999 // //=========================================================== namespace System.Runtime.Serialization.Formatters.Soap { using System.Runtime.Remoting; using System.Runtime.Remoting.Metadata; using System.Runtime.Serialization; using System; using System.Collections; using System.Reflection; using System.Diagnostics; using System.Globalization; // This class contains information about an object. It is used so that // the rest of the Formatter routines can use a common interface for // a normal object, an ISerializable object, and a surrogate object // // The methods in this class are for the internal use of the Formatters. // There use will be restricted when signing is supported for assemblies internal sealed class WriteObjectInfo { internal int objectInfoId; internal Object obj; internal Type objectType; internal bool isSi = false; internal bool isNamed = false; internal bool isTyped = false; internal SerializationInfo si = null; internal SerObjectInfoCache cache = null; internal Object[] memberData = null; internal ISerializationSurrogate serializationSurrogate = null; internal ISurrogateSelector surrogateSelector; internal IFormatterConverter converter; internal StreamingContext context; internal SerObjectInfoInit serObjectInfoInit = null; // Writing and Parsing information internal long objectId; internal long assemId; private int lastPosition = 0; private SoapAttributeInfo parentMemberAttributeInfo; internal bool isArray = false; internal SoapAttributeInfo typeAttributeInfo; internal WriteObjectInfo arrayElemObjectInfo; internal WriteObjectInfo() { } internal void ObjectEnd() { InternalST.Soap( this, objectInfoId," objectType ",objectType," ObjectEnd"); PutObjectInfo(serObjectInfoInit, this); } private void InternalInit() { InternalST.Soap( this, objectInfoId," InternalInit"); obj = null; objectType = null; isSi = false; isNamed = false; isTyped = false; si = null; cache = null; memberData = null; isArray = false; // Writing and Parsing information objectId = 0; assemId = 0; // Added for Soap lastPosition = 0; typeAttributeInfo = null; parentMemberAttributeInfo = null; arrayElemObjectInfo = null; } internal static WriteObjectInfo Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, SoapAttributeInfo attributeInfo, ObjectWriter objectWriter) { WriteObjectInfo soi = GetObjectInfo(serObjectInfoInit); soi.InitSerialize(obj, surrogateSelector, context, serObjectInfoInit, converter, attributeInfo, objectWriter); return soi; } // Write constructor internal void InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, SoapAttributeInfo attributeInfo, ObjectWriter objectWriter) { InternalST.Soap( this, objectInfoId," Constructor 1 ",obj); this.context = context; this.obj = obj; this.serObjectInfoInit = serObjectInfoInit; this.parentMemberAttributeInfo = attributeInfo; this.surrogateSelector = surrogateSelector; this.converter = converter; ISurrogateSelector surrogateSelectorTemp; if (RemotingServices.IsTransparentProxy(obj)) objectType = Converter.typeofMarshalByRefObject; else objectType = obj.GetType(); if (objectType.IsArray) { arrayElemObjectInfo = Serialize(objectType.GetElementType(), surrogateSelector, context, serObjectInfoInit, converter, null); typeAttributeInfo = GetTypeAttributeInfo(); isArray = true; InitNoMembers(); return; } InternalST.Soap( this, objectInfoId," Constructor 1 trace 2"); typeAttributeInfo = GetTypeAttributeInfo(); objectWriter.ObjectManager.RegisterObject(obj); if (surrogateSelector != null && (serializationSurrogate = surrogateSelector.GetSurrogate(objectType, context, out surrogateSelectorTemp)) != null) { InternalST.Soap( this, objectInfoId," Constructor 1 trace 3"); si = new SerializationInfo(objectType, converter); if (!objectType.IsPrimitive) serializationSurrogate.GetObjectData(obj, si, context); InitSiWrite(objectWriter); } else if (obj is ISerializable) { if (!objectType.IsSerializable) { throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_NonSerType"), objectType.FullName, objectType.Module.Assembly.FullName)); } si = new SerializationInfo(objectType, converter); ((ISerializable)obj).GetObjectData(si, context); InternalST.Soap( this, objectInfoId," Constructor 1 trace 4 ISerializable "+objectType); InitSiWrite(objectWriter); } else { InternalST.Soap(this, objectInfoId," Constructor 1 trace 5"); InitMemberInfo(); } } [Conditional("SER_LOGGING")] private void DumpMemberInfo() { for (int i=0; i0) { SoapAttributeInfo attributeInfo = cache.memberAttributeInfos[Position(name)]; isEmbedded = attributeInfo.IsEmbedded(); } InternalST.Soap( this,objectInfoId," ", objectType," IsEmbedded Exit ",isEmbedded); return isEmbedded; } } internal sealed class ReadObjectInfo { internal int objectInfoId; internal Object obj; internal Type objectType; internal ObjectManager objectManager; internal int count; internal bool isSi = false; internal bool isNamed = false; internal bool isTyped = false; internal SerializationInfo si = null; internal SerObjectInfoCache cache = null; internal String[] wireMemberNames = null; internal Type[] wireMemberTypes = null; internal Object[] memberData = null; internal String[] memberNames = null; private int lastPosition = 0; internal ISurrogateSelector surrogateSelector = null; internal ISerializationSurrogate serializationSurrogate = null; internal StreamingContext context; // Si Read internal ArrayList memberTypesList; internal SerObjectInfoInit serObjectInfoInit = null; internal IFormatterConverter formatterConverter; // fake object for soap top record when remoting or IRemotingFormatter interface internal bool bfake = false; internal bool bSoapFault = false; internal ArrayList paramNameList; // Contain parameter names in correct order private int majorVersion = 0; private int minorVersion = 0; internal SoapAttributeInfo typeAttributeInfo; private ReadObjectInfo arrayElemObjectInfo; private int numberMembersSeen = 0; internal ReadObjectInfo() { } internal void ObjectEnd() { InternalST.Soap( this, objectInfoId," objectType ",objectType," ObjectEnd"); PutObjectInfo(serObjectInfoInit, this); } private void InternalInit() { InternalST.Soap( this, objectInfoId," objectType ",objectType," InternalInit"); obj = null; objectType = null; count = 0; isSi = false; isNamed = false; isTyped = false; si = null; wireMemberNames = null; wireMemberTypes = null; cache = null; lastPosition = 0; numberMembersSeen = 0; bfake = false; bSoapFault = false; majorVersion = 0; minorVersion = 0; typeAttributeInfo = null; arrayElemObjectInfo = null; // Si Read if (memberTypesList != null) { memberTypesList.Clear(); } } internal static ReadObjectInfo Create(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName) { ReadObjectInfo soi = GetObjectInfo(serObjectInfoInit); soi.Init(objectType, surrogateSelector, context, objectManager, serObjectInfoInit, converter, assemblyName); return soi; } // Read Constructor internal void Init(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName) { InternalST.Soap( this, objectInfoId," Constructor 3 ",objectType); this.objectType = objectType; this.objectManager = objectManager; this.context = context; this.serObjectInfoInit = serObjectInfoInit; this.formatterConverter = converter; InitReadConstructor(objectType, surrogateSelector, context, assemblyName); } internal static ReadObjectInfo Create(Type objectType, String[] memberNames, Type[] memberTypes, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName) { ReadObjectInfo soi = GetObjectInfo(serObjectInfoInit); soi.Init(objectType, memberNames,memberTypes, surrogateSelector, context, objectManager, serObjectInfoInit, converter, assemblyName); return soi; } // Read Constructor internal void Init(Type objectType, String[] memberNames, Type[] memberTypes, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName) { InternalST.Soap( this,objectInfoId, " Constructor 5 ",objectType); this.objectType = objectType; this.objectManager = objectManager; this.wireMemberNames = memberNames; this.wireMemberTypes = memberTypes; this.context = context; this.serObjectInfoInit = serObjectInfoInit; this.formatterConverter = converter; if (memberNames != null) isNamed = true; if (memberTypes != null) isTyped = true; InitReadConstructor(objectType, surrogateSelector, context, assemblyName); } private void InitReadConstructor(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, String assemblyName) { InternalST.Soap( this,objectInfoId," ", objectType," InitReadConstructor Entry ",objectType); if (objectType.IsArray) { arrayElemObjectInfo = Create(objectType.GetElementType(), surrogateSelector, context, objectManager, serObjectInfoInit, formatterConverter, assemblyName); typeAttributeInfo = GetTypeAttributeInfo(); InitNoMembers(); return; } ISurrogateSelector surrogateSelectorTemp = null; if (surrogateSelector!=null) serializationSurrogate = surrogateSelector.GetSurrogate(objectType, context, out surrogateSelectorTemp); if (serializationSurrogate != null) { isSi = true; } else if (objectType == Converter.typeofObject) { } else if (Converter.typeofISerializable.IsAssignableFrom(objectType)) isSi = true; if (isSi) { si = new SerializationInfo(objectType, formatterConverter); InitSiRead(assemblyName); } else { InitMemberInfo(); } InternalST.Soap( this,objectInfoId," ", objectType," InitReadConstructor Exit ",isSi); } private void InitSiRead(String assemblyName) { InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo new cache"); if (assemblyName != null) { // Need to set to assembly name from the wire. This assembly name could contain version information // not in the default assembly name which was returned from fusion si.AssemblyName = assemblyName; } cache = new SerObjectInfoCache(); cache.fullTypeName = si.FullTypeName; cache.assemblyString = si.AssemblyName; // Input from IFieldInfo cache.memberNames = wireMemberNames; cache.memberTypes = wireMemberTypes; if (memberTypesList != null) { memberTypesList = new ArrayList(20); } if (wireMemberNames != null && wireMemberTypes != null) isTyped = true; } private void InitNoMembers() { cache = (SerObjectInfoCache)serObjectInfoInit.seenBeforeTable[objectType]; if (cache == null) { InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo new cache"); cache = new SerObjectInfoCache(); cache.fullTypeName = objectType.FullName; cache.assemblyString = objectType.Module.Assembly.FullName; serObjectInfoInit.seenBeforeTable.Add(objectType, cache); } } private void InitMemberInfo() { InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo Entry"); cache = (SerObjectInfoCache)serObjectInfoInit.seenBeforeTable[objectType]; if (cache == null) { InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo new cache"); cache = new SerObjectInfoCache(); cache.memberInfos = FormatterServices.GetSerializableMembers(objectType, context); count = cache.memberInfos.Length; cache.memberNames = new String[count]; cache.memberTypes = new Type[count]; cache.memberAttributeInfos = new SoapAttributeInfo[count]; // Calculate new arrays for (int i=0; i = cache.memberTypes.Length) throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_ISerializableTypes"),objectType+" "+position)); type = cache.memberTypes[position]; InternalST.Soap( this,objectInfoId," ", objectType," GetType Exit ByPosition ",type); } return type; } internal void AddParamName(String name) { if (!bfake) return; if (name[0] == '_' && name[1] == '_') { if (name == "__fault") { bSoapFault = true; return; } else if (name == "__methodName" || name == "__keyToNamespaceTable" || name == "__paramNameList" || name == "__xmlNameSpace") { return; } } InternalST.Soap( this,objectInfoId," ", objectType," AddParamName Add "+name); paramNameList.Add(name); } // Adds the value for a memberName internal void AddValue(String name, Object value) { InternalST.Soap( this,objectInfoId," ", objectType," AddValue ",name," ",value," isSi ",isSi); if (isSi) { if (bfake) { AddParamName(name); } si.AddValue(name, value); } else { // Console.WriteLine("Calling add value for " + name + " with value " + value); int position = Position(name); memberData[position] = value; memberNames[position] = name; } } internal void AddMemberSeen() { InternalST.Soap( this,objectInfoId," ", objectType," AddMemberSeen "); numberMembersSeen++; } //Soap fake object internal ArrayList SetFakeObject() { bfake = true; paramNameList = new ArrayList(10); return paramNameList; } internal void SetVersion(int major, int minor) { majorVersion = major; minorVersion = minor; } // Records an objectId in a member when the actual object for that member is not yet known internal void RecordFixup(long objectId, String name, long idRef) { if (isSi) { InternalST.Soap( this,objectInfoId," ", objectType, " RecordFixup RecordDelayedFixup objectId ",objectId," name ",name," idRef ",idRef," isSi ",isSi); objectManager.RecordDelayedFixup(objectId, name, idRef); } else { InternalST.Soap( this,objectInfoId," ", objectType," RecordFixup objectId ",objectId," name ",name," idRef ",idRef," isSi ",isSi); objectManager.RecordFixup(objectId, cache.memberInfos[Position(name)], idRef); } } // Fills in the values for an object internal void PopulateObjectMembers() { InternalST.Soap( this,objectInfoId," ", objectType," PopulateObjectMembers isSi ",isSi); if (!isSi) { MemberInfo[] finalMemberInfos = null; Object[] finalMemberData = null; int finalMemberIndex = 0; if (numberMembersSeen < memberNames.Length) { finalMemberInfos = new MemberInfo[numberMembersSeen]; finalMemberData = new Object[numberMembersSeen]; for (int iMember = 0; iMember < memberNames.Length; ++iMember) { if (memberNames[iMember] == null) { // A field on the type isnt found. See if the field has OptionallySerializable and the type has the deserialization constructor Object [] attrs = cache.memberInfos[iMember].GetCustomAttributes(typeof(OptionalFieldAttribute), false); if ((attrs == null || attrs.Length == 0) && (majorVersion >= 1 && minorVersion >= 0) ){ // the member isnt optionally serializable throw new SerializationException(SoapUtil.GetResourceString("Serialization_WrongNumberOfMembers", objectType, cache.memberInfos.Length, numberMembersSeen)); } } else { if (memberNames[iMember] != cache.memberInfos[iMember].Name) { throw new SerializationException(SoapUtil.GetResourceString("Serialization_WrongNumberOfMembers", objectType, cache.memberInfos.Length, numberMembersSeen)); } finalMemberInfos[finalMemberIndex] = cache.memberInfos[iMember]; finalMemberData[finalMemberIndex] = memberData[iMember]; finalMemberIndex++; } } } else { finalMemberInfos = cache.memberInfos; finalMemberData = memberData; } DumpPopulate(finalMemberInfos, finalMemberData); FormatterServices.PopulateObjectMembers(obj, finalMemberInfos, finalMemberData); numberMembersSeen = 0; } } [Conditional("SER_LOGGING")] private void DumpPopulate(MemberInfo[] memberInfos, Object[] memberData) { for (int i=0; i // Author: Peter de Jong ([....]) // // Purpose: Holds information about an objects Members // // Date: September 29, 1999 // //=========================================================== namespace System.Runtime.Serialization.Formatters.Soap { using System.Runtime.Remoting; using System.Runtime.Remoting.Metadata; using System.Runtime.Serialization; using System; using System.Collections; using System.Reflection; using System.Diagnostics; using System.Globalization; // This class contains information about an object. It is used so that // the rest of the Formatter routines can use a common interface for // a normal object, an ISerializable object, and a surrogate object // // The methods in this class are for the internal use of the Formatters. // There use will be restricted when signing is supported for assemblies internal sealed class WriteObjectInfo { internal int objectInfoId; internal Object obj; internal Type objectType; internal bool isSi = false; internal bool isNamed = false; internal bool isTyped = false; internal SerializationInfo si = null; internal SerObjectInfoCache cache = null; internal Object[] memberData = null; internal ISerializationSurrogate serializationSurrogate = null; internal ISurrogateSelector surrogateSelector; internal IFormatterConverter converter; internal StreamingContext context; internal SerObjectInfoInit serObjectInfoInit = null; // Writing and Parsing information internal long objectId; internal long assemId; private int lastPosition = 0; private SoapAttributeInfo parentMemberAttributeInfo; internal bool isArray = false; internal SoapAttributeInfo typeAttributeInfo; internal WriteObjectInfo arrayElemObjectInfo; internal WriteObjectInfo() { } internal void ObjectEnd() { InternalST.Soap( this, objectInfoId," objectType ",objectType," ObjectEnd"); PutObjectInfo(serObjectInfoInit, this); } private void InternalInit() { InternalST.Soap( this, objectInfoId," InternalInit"); obj = null; objectType = null; isSi = false; isNamed = false; isTyped = false; si = null; cache = null; memberData = null; isArray = false; // Writing and Parsing information objectId = 0; assemId = 0; // Added for Soap lastPosition = 0; typeAttributeInfo = null; parentMemberAttributeInfo = null; arrayElemObjectInfo = null; } internal static WriteObjectInfo Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, SoapAttributeInfo attributeInfo, ObjectWriter objectWriter) { WriteObjectInfo soi = GetObjectInfo(serObjectInfoInit); soi.InitSerialize(obj, surrogateSelector, context, serObjectInfoInit, converter, attributeInfo, objectWriter); return soi; } // Write constructor internal void InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, SoapAttributeInfo attributeInfo, ObjectWriter objectWriter) { InternalST.Soap( this, objectInfoId," Constructor 1 ",obj); this.context = context; this.obj = obj; this.serObjectInfoInit = serObjectInfoInit; this.parentMemberAttributeInfo = attributeInfo; this.surrogateSelector = surrogateSelector; this.converter = converter; ISurrogateSelector surrogateSelectorTemp; if (RemotingServices.IsTransparentProxy(obj)) objectType = Converter.typeofMarshalByRefObject; else objectType = obj.GetType(); if (objectType.IsArray) { arrayElemObjectInfo = Serialize(objectType.GetElementType(), surrogateSelector, context, serObjectInfoInit, converter, null); typeAttributeInfo = GetTypeAttributeInfo(); isArray = true; InitNoMembers(); return; } InternalST.Soap( this, objectInfoId," Constructor 1 trace 2"); typeAttributeInfo = GetTypeAttributeInfo(); objectWriter.ObjectManager.RegisterObject(obj); if (surrogateSelector != null && (serializationSurrogate = surrogateSelector.GetSurrogate(objectType, context, out surrogateSelectorTemp)) != null) { InternalST.Soap( this, objectInfoId," Constructor 1 trace 3"); si = new SerializationInfo(objectType, converter); if (!objectType.IsPrimitive) serializationSurrogate.GetObjectData(obj, si, context); InitSiWrite(objectWriter); } else if (obj is ISerializable) { if (!objectType.IsSerializable) { throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_NonSerType"), objectType.FullName, objectType.Module.Assembly.FullName)); } si = new SerializationInfo(objectType, converter); ((ISerializable)obj).GetObjectData(si, context); InternalST.Soap( this, objectInfoId," Constructor 1 trace 4 ISerializable "+objectType); InitSiWrite(objectWriter); } else { InternalST.Soap(this, objectInfoId," Constructor 1 trace 5"); InitMemberInfo(); } } [Conditional("SER_LOGGING")] private void DumpMemberInfo() { for (int i=0; i 0) { SoapAttributeInfo attributeInfo = cache.memberAttributeInfos[Position(name)]; isEmbedded = attributeInfo.IsEmbedded(); } InternalST.Soap( this,objectInfoId," ", objectType," IsEmbedded Exit ",isEmbedded); return isEmbedded; } } internal sealed class ReadObjectInfo { internal int objectInfoId; internal Object obj; internal Type objectType; internal ObjectManager objectManager; internal int count; internal bool isSi = false; internal bool isNamed = false; internal bool isTyped = false; internal SerializationInfo si = null; internal SerObjectInfoCache cache = null; internal String[] wireMemberNames = null; internal Type[] wireMemberTypes = null; internal Object[] memberData = null; internal String[] memberNames = null; private int lastPosition = 0; internal ISurrogateSelector surrogateSelector = null; internal ISerializationSurrogate serializationSurrogate = null; internal StreamingContext context; // Si Read internal ArrayList memberTypesList; internal SerObjectInfoInit serObjectInfoInit = null; internal IFormatterConverter formatterConverter; // fake object for soap top record when remoting or IRemotingFormatter interface internal bool bfake = false; internal bool bSoapFault = false; internal ArrayList paramNameList; // Contain parameter names in correct order private int majorVersion = 0; private int minorVersion = 0; internal SoapAttributeInfo typeAttributeInfo; private ReadObjectInfo arrayElemObjectInfo; private int numberMembersSeen = 0; internal ReadObjectInfo() { } internal void ObjectEnd() { InternalST.Soap( this, objectInfoId," objectType ",objectType," ObjectEnd"); PutObjectInfo(serObjectInfoInit, this); } private void InternalInit() { InternalST.Soap( this, objectInfoId," objectType ",objectType," InternalInit"); obj = null; objectType = null; count = 0; isSi = false; isNamed = false; isTyped = false; si = null; wireMemberNames = null; wireMemberTypes = null; cache = null; lastPosition = 0; numberMembersSeen = 0; bfake = false; bSoapFault = false; majorVersion = 0; minorVersion = 0; typeAttributeInfo = null; arrayElemObjectInfo = null; // Si Read if (memberTypesList != null) { memberTypesList.Clear(); } } internal static ReadObjectInfo Create(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName) { ReadObjectInfo soi = GetObjectInfo(serObjectInfoInit); soi.Init(objectType, surrogateSelector, context, objectManager, serObjectInfoInit, converter, assemblyName); return soi; } // Read Constructor internal void Init(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName) { InternalST.Soap( this, objectInfoId," Constructor 3 ",objectType); this.objectType = objectType; this.objectManager = objectManager; this.context = context; this.serObjectInfoInit = serObjectInfoInit; this.formatterConverter = converter; InitReadConstructor(objectType, surrogateSelector, context, assemblyName); } internal static ReadObjectInfo Create(Type objectType, String[] memberNames, Type[] memberTypes, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName) { ReadObjectInfo soi = GetObjectInfo(serObjectInfoInit); soi.Init(objectType, memberNames,memberTypes, surrogateSelector, context, objectManager, serObjectInfoInit, converter, assemblyName); return soi; } // Read Constructor internal void Init(Type objectType, String[] memberNames, Type[] memberTypes, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, String assemblyName) { InternalST.Soap( this,objectInfoId, " Constructor 5 ",objectType); this.objectType = objectType; this.objectManager = objectManager; this.wireMemberNames = memberNames; this.wireMemberTypes = memberTypes; this.context = context; this.serObjectInfoInit = serObjectInfoInit; this.formatterConverter = converter; if (memberNames != null) isNamed = true; if (memberTypes != null) isTyped = true; InitReadConstructor(objectType, surrogateSelector, context, assemblyName); } private void InitReadConstructor(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, String assemblyName) { InternalST.Soap( this,objectInfoId," ", objectType," InitReadConstructor Entry ",objectType); if (objectType.IsArray) { arrayElemObjectInfo = Create(objectType.GetElementType(), surrogateSelector, context, objectManager, serObjectInfoInit, formatterConverter, assemblyName); typeAttributeInfo = GetTypeAttributeInfo(); InitNoMembers(); return; } ISurrogateSelector surrogateSelectorTemp = null; if (surrogateSelector!=null) serializationSurrogate = surrogateSelector.GetSurrogate(objectType, context, out surrogateSelectorTemp); if (serializationSurrogate != null) { isSi = true; } else if (objectType == Converter.typeofObject) { } else if (Converter.typeofISerializable.IsAssignableFrom(objectType)) isSi = true; if (isSi) { si = new SerializationInfo(objectType, formatterConverter); InitSiRead(assemblyName); } else { InitMemberInfo(); } InternalST.Soap( this,objectInfoId," ", objectType," InitReadConstructor Exit ",isSi); } private void InitSiRead(String assemblyName) { InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo new cache"); if (assemblyName != null) { // Need to set to assembly name from the wire. This assembly name could contain version information // not in the default assembly name which was returned from fusion si.AssemblyName = assemblyName; } cache = new SerObjectInfoCache(); cache.fullTypeName = si.FullTypeName; cache.assemblyString = si.AssemblyName; // Input from IFieldInfo cache.memberNames = wireMemberNames; cache.memberTypes = wireMemberTypes; if (memberTypesList != null) { memberTypesList = new ArrayList(20); } if (wireMemberNames != null && wireMemberTypes != null) isTyped = true; } private void InitNoMembers() { cache = (SerObjectInfoCache)serObjectInfoInit.seenBeforeTable[objectType]; if (cache == null) { InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo new cache"); cache = new SerObjectInfoCache(); cache.fullTypeName = objectType.FullName; cache.assemblyString = objectType.Module.Assembly.FullName; serObjectInfoInit.seenBeforeTable.Add(objectType, cache); } } private void InitMemberInfo() { InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo Entry"); cache = (SerObjectInfoCache)serObjectInfoInit.seenBeforeTable[objectType]; if (cache == null) { InternalST.Soap( this,objectInfoId," ", objectType," InitMemberInfo new cache"); cache = new SerObjectInfoCache(); cache.memberInfos = FormatterServices.GetSerializableMembers(objectType, context); count = cache.memberInfos.Length; cache.memberNames = new String[count]; cache.memberTypes = new Type[count]; cache.memberAttributeInfos = new SoapAttributeInfo[count]; // Calculate new arrays for (int i=0; i = cache.memberTypes.Length) throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_ISerializableTypes"),objectType+" "+position)); type = cache.memberTypes[position]; InternalST.Soap( this,objectInfoId," ", objectType," GetType Exit ByPosition ",type); } return type; } internal void AddParamName(String name) { if (!bfake) return; if (name[0] == '_' && name[1] == '_') { if (name == "__fault") { bSoapFault = true; return; } else if (name == "__methodName" || name == "__keyToNamespaceTable" || name == "__paramNameList" || name == "__xmlNameSpace") { return; } } InternalST.Soap( this,objectInfoId," ", objectType," AddParamName Add "+name); paramNameList.Add(name); } // Adds the value for a memberName internal void AddValue(String name, Object value) { InternalST.Soap( this,objectInfoId," ", objectType," AddValue ",name," ",value," isSi ",isSi); if (isSi) { if (bfake) { AddParamName(name); } si.AddValue(name, value); } else { // Console.WriteLine("Calling add value for " + name + " with value " + value); int position = Position(name); memberData[position] = value; memberNames[position] = name; } } internal void AddMemberSeen() { InternalST.Soap( this,objectInfoId," ", objectType," AddMemberSeen "); numberMembersSeen++; } //Soap fake object internal ArrayList SetFakeObject() { bfake = true; paramNameList = new ArrayList(10); return paramNameList; } internal void SetVersion(int major, int minor) { majorVersion = major; minorVersion = minor; } // Records an objectId in a member when the actual object for that member is not yet known internal void RecordFixup(long objectId, String name, long idRef) { if (isSi) { InternalST.Soap( this,objectInfoId," ", objectType, " RecordFixup RecordDelayedFixup objectId ",objectId," name ",name," idRef ",idRef," isSi ",isSi); objectManager.RecordDelayedFixup(objectId, name, idRef); } else { InternalST.Soap( this,objectInfoId," ", objectType," RecordFixup objectId ",objectId," name ",name," idRef ",idRef," isSi ",isSi); objectManager.RecordFixup(objectId, cache.memberInfos[Position(name)], idRef); } } // Fills in the values for an object internal void PopulateObjectMembers() { InternalST.Soap( this,objectInfoId," ", objectType," PopulateObjectMembers isSi ",isSi); if (!isSi) { MemberInfo[] finalMemberInfos = null; Object[] finalMemberData = null; int finalMemberIndex = 0; if (numberMembersSeen < memberNames.Length) { finalMemberInfos = new MemberInfo[numberMembersSeen]; finalMemberData = new Object[numberMembersSeen]; for (int iMember = 0; iMember < memberNames.Length; ++iMember) { if (memberNames[iMember] == null) { // A field on the type isnt found. See if the field has OptionallySerializable and the type has the deserialization constructor Object [] attrs = cache.memberInfos[iMember].GetCustomAttributes(typeof(OptionalFieldAttribute), false); if ((attrs == null || attrs.Length == 0) && (majorVersion >= 1 && minorVersion >= 0) ){ // the member isnt optionally serializable throw new SerializationException(SoapUtil.GetResourceString("Serialization_WrongNumberOfMembers", objectType, cache.memberInfos.Length, numberMembersSeen)); } } else { if (memberNames[iMember] != cache.memberInfos[iMember].Name) { throw new SerializationException(SoapUtil.GetResourceString("Serialization_WrongNumberOfMembers", objectType, cache.memberInfos.Length, numberMembersSeen)); } finalMemberInfos[finalMemberIndex] = cache.memberInfos[iMember]; finalMemberData[finalMemberIndex] = memberData[iMember]; finalMemberIndex++; } } } else { finalMemberInfos = cache.memberInfos; finalMemberData = memberData; } DumpPopulate(finalMemberInfos, finalMemberData); FormatterServices.PopulateObjectMembers(obj, finalMemberInfos, finalMemberData); numberMembersSeen = 0; } } [Conditional("SER_LOGGING")] private void DumpPopulate(MemberInfo[] memberInfos, Object[] memberData) { for (int i=0; i
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- AdapterUtil.cs
- DigestTraceRecordHelper.cs
- XmlRootAttribute.cs
- AnyAllSearchOperator.cs
- PageCopyCount.cs
- XmlHierarchicalEnumerable.cs
- CodeDirectiveCollection.cs
- DiffuseMaterial.cs
- UIElementPropertyUndoUnit.cs
- HeaderedItemsControl.cs
- BitFlagsGenerator.cs
- HttpRawResponse.cs
- ListSortDescription.cs
- TreeNodeStyleCollectionEditor.cs
- VisualStyleRenderer.cs
- FederatedMessageSecurityOverHttpElement.cs
- XomlSerializationHelpers.cs
- FrameworkRichTextComposition.cs
- DescendentsWalker.cs
- WindowsUserNameSecurityTokenAuthenticator.cs
- TrackingLocation.cs
- TextSelectionHelper.cs
- InputLangChangeEvent.cs
- Pair.cs
- TextRangeEditLists.cs
- LambdaCompiler.Binary.cs
- CharacterShapingProperties.cs
- HostedTransportConfigurationManager.cs
- TextReturnReader.cs
- EntityDataSourceWrapperPropertyDescriptor.cs
- RSAPKCS1KeyExchangeFormatter.cs
- FloaterParaClient.cs
- ChildChangedEventArgs.cs
- OdbcCommand.cs
- CookieProtection.cs
- Transform3D.cs
- ProcessModuleCollection.cs
- SqlDataSourceCommandEventArgs.cs
- SqlClientMetaDataCollectionNames.cs
- EnumDataContract.cs
- ImplicitInputBrush.cs
- ValidationEventArgs.cs
- GridViewCancelEditEventArgs.cs
- HttpListenerResponse.cs
- StylusPointCollection.cs
- XmlSchemaSequence.cs
- Polyline.cs
- IdentityValidationException.cs
- SecureConversationDriver.cs
- SQLBytes.cs
- CssClassPropertyAttribute.cs
- HwndKeyboardInputProvider.cs
- XmlSchemaAnnotated.cs
- ContentFileHelper.cs
- ExtenderProvidedPropertyAttribute.cs
- WeakHashtable.cs
- InnerItemCollectionView.cs
- LexicalChunk.cs
- InheritanceRules.cs
- AxWrapperGen.cs
- HWStack.cs
- LeaseManager.cs
- BinaryObjectInfo.cs
- CallbackWrapper.cs
- Reference.cs
- SecurityHelper.cs
- VarRefManager.cs
- RectangleHotSpot.cs
- MultiBinding.cs
- WindowsGraphics2.cs
- BreakSafeBase.cs
- EffectiveValueEntry.cs
- OracleLob.cs
- IdleTimeoutMonitor.cs
- Helpers.cs
- DiagnosticsConfigurationHandler.cs
- COAUTHINFO.cs
- PolyBezierSegment.cs
- SourceSwitch.cs
- SpeechSynthesizer.cs
- MetafileHeaderWmf.cs
- COM2IManagedPerPropertyBrowsingHandler.cs
- Action.cs
- AuthenticationModuleElementCollection.cs
- ConfigXmlReader.cs
- HybridDictionary.cs
- StreamingContext.cs
- DbConnectionPoolGroupProviderInfo.cs
- OpCopier.cs
- AQNBuilder.cs
- DataTableClearEvent.cs
- ConfigurationStrings.cs
- TraceContext.cs
- NumberSubstitution.cs
- XPathNodeList.cs
- CfgParser.cs
- DataKeyArray.cs
- DesignConnectionCollection.cs
- WebPartTransformerAttribute.cs
- ManualResetEvent.cs