SoapObjectInfo.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / 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; 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
// 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

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK