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
- ValidatingPropertiesEventArgs.cs
- ObjectContext.cs
- UrlMappingsSection.cs
- WSAddressing10ProblemHeaderQNameFault.cs
- XmlDocumentFragment.cs
- ExeConfigurationFileMap.cs
- HMACSHA256.cs
- TraceProvider.cs
- RoleBoolean.cs
- XmlNodeChangedEventArgs.cs
- DBAsyncResult.cs
- ControlBuilderAttribute.cs
- ConfigurationSectionGroup.cs
- GeneralTransformGroup.cs
- ProtocolsConfigurationEntry.cs
- OutOfMemoryException.cs
- StorageAssociationSetMapping.cs
- StateMachineDesignerPaint.cs
- XmlCharCheckingWriter.cs
- VirtualDirectoryMappingCollection.cs
- counter.cs
- DataTableCollection.cs
- HostedTransportConfigurationBase.cs
- XmlWrappingReader.cs
- FixUpCollection.cs
- GridViewCellAutomationPeer.cs
- DelegateBodyWriter.cs
- SqlBulkCopy.cs
- InputReport.cs
- ContextMenuStripActionList.cs
- SafeLibraryHandle.cs
- ResourceWriter.cs
- ByteStreamMessage.cs
- BeginGetFileNameFromUserRequest.cs
- CompressEmulationStream.cs
- ComAwareEventInfo.cs
- ToolboxItemAttribute.cs
- AppDomainProtocolHandler.cs
- DetailsViewRow.cs
- ClientFormsIdentity.cs
- TransformedBitmap.cs
- _NegoStream.cs
- RelationshipConverter.cs
- DataRowChangeEvent.cs
- BamlRecordHelper.cs
- HttpException.cs
- DataGridViewBindingCompleteEventArgs.cs
- XPathDocumentNavigator.cs
- EnlistmentTraceIdentifier.cs
- RetrieveVirtualItemEventArgs.cs
- CheckBoxFlatAdapter.cs
- DataObject.cs
- DbMetaDataFactory.cs
- X509Extension.cs
- SettingsAttributes.cs
- BamlTreeNode.cs
- NativeMethodsOther.cs
- GuidelineSet.cs
- NativeCppClassAttribute.cs
- SqlBuilder.cs
- ValidationResult.cs
- AdapterUtil.cs
- DataSourceGeneratorException.cs
- TablePatternIdentifiers.cs
- WriteLine.cs
- HtmlFormWrapper.cs
- Empty.cs
- CodeEntryPointMethod.cs
- HttpHandlersSection.cs
- ExecutionContext.cs
- SystemIPAddressInformation.cs
- UpdateRecord.cs
- SuppressIldasmAttribute.cs
- EventLog.cs
- WinCategoryAttribute.cs
- LongMinMaxAggregationOperator.cs
- ExceptionHelpers.cs
- Contracts.cs
- DrawingCollection.cs
- SingletonInstanceContextProvider.cs
- ConfigXmlWhitespace.cs
- Utilities.cs
- EpmTargetPathSegment.cs
- InternalBufferOverflowException.cs
- Membership.cs
- WebServiceEnumData.cs
- ColorAnimationUsingKeyFrames.cs
- RoutedEventConverter.cs
- MultilineStringEditor.cs
- ArraySet.cs
- Win32.cs
- EpmCustomContentSerializer.cs
- Enum.cs
- CodeTypeReferenceExpression.cs
- RouteValueExpressionBuilder.cs
- TextDecoration.cs
- ChannelManagerBase.cs
- XmlSerializerVersionAttribute.cs
- DetailsViewPagerRow.cs
- TextTreeUndoUnit.cs