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
- ProcessProtocolHandler.cs
- SaveFileDialog.cs
- DataGridViewComboBoxCell.cs
- TreeView.cs
- DockingAttribute.cs
- UnmanagedMemoryStreamWrapper.cs
- LineSegment.cs
- MenuItemBinding.cs
- OdbcConnectionOpen.cs
- NamespaceImport.cs
- _DisconnectOverlappedAsyncResult.cs
- ToggleProviderWrapper.cs
- XPathParser.cs
- CellNormalizer.cs
- TextMessageEncodingElement.cs
- BooleanKeyFrameCollection.cs
- SemanticResultKey.cs
- HtmlElementErrorEventArgs.cs
- TlsSspiNegotiation.cs
- CompoundFileIOPermission.cs
- AmbientLight.cs
- DrawingContext.cs
- ObjectDataProvider.cs
- MessageHeader.cs
- ConfigLoader.cs
- ScrollPattern.cs
- SerializationInfo.cs
- LoginCancelEventArgs.cs
- CroppedBitmap.cs
- EnumValidator.cs
- nulltextcontainer.cs
- XmlAttribute.cs
- WindowsFormsHost.cs
- OLEDB_Enum.cs
- StylusPointProperty.cs
- WindowsBrush.cs
- SafePEFileHandle.cs
- BaseResourcesBuildProvider.cs
- OperationParameterInfoCollection.cs
- StoreContentChangedEventArgs.cs
- filewebrequest.cs
- WindowsToolbar.cs
- NamespaceList.cs
- InputLangChangeEvent.cs
- SchemaTableOptionalColumn.cs
- DPTypeDescriptorContext.cs
- Renderer.cs
- WindowsProgressbar.cs
- BehaviorEditorPart.cs
- BitmapCacheBrush.cs
- OdbcConnection.cs
- SqlNode.cs
- DesignTimeParseData.cs
- LicenseContext.cs
- DrawListViewItemEventArgs.cs
- DoubleAnimationClockResource.cs
- KnownTypes.cs
- WebFormsRootDesigner.cs
- TableFieldsEditor.cs
- DependencyObject.cs
- SoapObjectInfo.cs
- PageCatalogPart.cs
- WebSysDefaultValueAttribute.cs
- Win32SafeHandles.cs
- ToggleProviderWrapper.cs
- ProtocolsConfiguration.cs
- ConnectionInterfaceCollection.cs
- CodeNamespaceCollection.cs
- DetailsViewCommandEventArgs.cs
- HtmlElementEventArgs.cs
- AxImporter.cs
- PeerInvitationResponse.cs
- DataGridViewBand.cs
- Buffer.cs
- Typeface.cs
- EmptyStringExpandableObjectConverter.cs
- FileRecordSequenceHelper.cs
- StreamResourceInfo.cs
- DataGridViewTextBoxCell.cs
- DoubleAnimation.cs
- MatrixCamera.cs
- SchemaImporter.cs
- TypeDescriptionProviderAttribute.cs
- FileUpload.cs
- PropertyTabAttribute.cs
- DataPointer.cs
- PolyQuadraticBezierSegmentFigureLogic.cs
- PropertyOverridesTypeEditor.cs
- DocumentXPathNavigator.cs
- SecurityElement.cs
- PointHitTestParameters.cs
- OleDbDataAdapter.cs
- WebPartCancelEventArgs.cs
- TableLayoutCellPaintEventArgs.cs
- ScrollChangedEventArgs.cs
- DefaultExpression.cs
- InfoCardCryptoHelper.cs
- ToolboxItem.cs
- UserControlCodeDomTreeGenerator.cs
- CheckBoxRenderer.cs