Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / 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
- SourceInterpreter.cs
- DoubleMinMaxAggregationOperator.cs
- CreateUserWizardDesigner.cs
- SqlDataSourceView.cs
- SqlWriter.cs
- RestHandlerFactory.cs
- GeneralTransform2DTo3D.cs
- ProfilePropertySettings.cs
- ControlBuilder.cs
- AppDomain.cs
- ImageCodecInfoPrivate.cs
- CheckedListBox.cs
- OdbcReferenceCollection.cs
- FaultBookmark.cs
- PersonalizablePropertyEntry.cs
- PageCache.cs
- QueryCacheManager.cs
- InternalPermissions.cs
- NodeLabelEditEvent.cs
- PanelDesigner.cs
- XmlSchemaAttributeGroupRef.cs
- Image.cs
- BuildProviderCollection.cs
- Classification.cs
- _Events.cs
- PageWrapper.cs
- SettingsPropertyCollection.cs
- Pen.cs
- ModelItemDictionaryImpl.cs
- XhtmlConformanceSection.cs
- IDictionary.cs
- ReachSerializer.cs
- MenuCommand.cs
- ExtendedPropertiesHandler.cs
- RegistryKey.cs
- BindingBase.cs
- ProxyBuilder.cs
- XPathArrayIterator.cs
- DefinitionBase.cs
- Compiler.cs
- IFlowDocumentViewer.cs
- ByteStreamBufferedMessageData.cs
- ResourceExpression.cs
- StaticFileHandler.cs
- FormViewRow.cs
- DataBoundControlDesigner.cs
- EntityCommandDefinition.cs
- SplashScreenNativeMethods.cs
- RoleExceptions.cs
- RowUpdatedEventArgs.cs
- GetRecipientListRequest.cs
- FixedSOMImage.cs
- ToolStripGripRenderEventArgs.cs
- TextEndOfSegment.cs
- WebBrowsableAttribute.cs
- EqualityComparer.cs
- FileStream.cs
- RoleServiceManager.cs
- ScriptManager.cs
- HttpServerVarsCollection.cs
- TextTreeText.cs
- EntitySqlQueryCacheKey.cs
- SafeProcessHandle.cs
- DesignerObjectListAdapter.cs
- FunctionUpdateCommand.cs
- RecommendedAsConfigurableAttribute.cs
- ToolBarButton.cs
- TextDecorationLocationValidation.cs
- Point.cs
- FastEncoderWindow.cs
- StrokeNode.cs
- DependencyObjectType.cs
- CodeDOMUtility.cs
- StringFreezingAttribute.cs
- HyperLink.cs
- ScrollChangedEventArgs.cs
- FormView.cs
- MouseDevice.cs
- HostingEnvironmentSection.cs
- AccessedThroughPropertyAttribute.cs
- ActivityCodeDomSerializer.cs
- SystemColorTracker.cs
- IntSecurity.cs
- FloatSumAggregationOperator.cs
- XmlArrayItemAttributes.cs
- ParameterBuilder.cs
- TripleDESCryptoServiceProvider.cs
- PresentationAppDomainManager.cs
- ColorComboBox.cs
- ProxyManager.cs
- StringConverter.cs
- BitmapScalingModeValidation.cs
- DbTypeMap.cs
- GridItemPatternIdentifiers.cs
- WebConfigurationFileMap.cs
- AppModelKnownContentFactory.cs
- EntityContainerEmitter.cs
- DataGridTextBoxColumn.cs
- EndPoint.cs
- ResourceReferenceKeyNotFoundException.cs