private void ReadObjectNull(BinaryHeaderEnum binaryHeaderEnum)
        {
            SerTrace.Log(this, "ReadObjectNull ");

            if (objectNull == null)
            {
                objectNull = new ObjectNull();
            }

            objectNull.Read(this, binaryHeaderEnum);
            objectNull.Dump();

            ObjectProgress objectOp = (ObjectProgress)stack.Peek();

            prs.Init();
            prs.PRparseTypeEnum   = InternalParseTypeE.Member;
            prs.PRmemberValueEnum = InternalMemberValueE.Null;

            if (objectOp.objectTypeEnum == InternalObjectTypeE.Object)
            {
                prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
                prs.PRname           = objectOp.name;
                prs.PRdtType         = objectOp.dtType;
            }
            else
            {
                prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
                prs.PRnullCount      = objectNull.nullCount;
                //only one null position has been incremented by GetNext
                //The position needs to be reset for the rest of the nulls
                objectOp.ArrayCountIncrement(objectNull.nullCount - 1);
            }
            objectReader.Parse(prs);
        }
Exemple #2
0
        [System.Security.SecurityCritical]  // auto-generated
        internal Object Deserialize(Stream serializationStream, HeaderHandler handler, bool fCheck, bool isCrossAppDomain, IMethodCallMessage methodCallMessage)
        {
            if (serializationStream == null)
            {
                throw new ArgumentNullException("serializationStream", Environment.GetResourceString("ArgumentNull_WithParamName", serializationStream));
            }
            Contract.EndContractBlock();

            if (serializationStream.CanSeek && (serializationStream.Length == 0))
            {
                throw new SerializationException(Environment.GetResourceString("Serialization_Stream"));
            }

            SerTrace.Log(this, "Deserialize Entry");
            InternalFE formatterEnums = new InternalFE();

            formatterEnums.FEtypeFormat         = m_typeFormat;
            formatterEnums.FEserializerTypeEnum = InternalSerializerTypeE.Binary;
            formatterEnums.FEassemblyFormat     = m_assemblyFormat;
            formatterEnums.FEsecurityLevel      = m_securityLevel;

            ObjectReader sor = new ObjectReader(serializationStream, m_surrogates, m_context, formatterEnums, m_binder);

            sor.crossAppDomainArray = m_crossAppDomainArray;
            return(sor.Deserialize(handler, new __BinaryParser(serializationStream, sor), fCheck, isCrossAppDomain, methodCallMessage));
        }
        private void ReadMemberPrimitiveUnTyped()
        {
            SerTrace.Log(this, "ReadMemberPrimitiveUnTyped ");
            ObjectProgress objectOp = (ObjectProgress)stack.Peek();

            if (memberPrimitiveUnTyped == null)
            {
                memberPrimitiveUnTyped = new MemberPrimitiveUnTyped();
            }
            memberPrimitiveUnTyped.Set((InternalPrimitiveTypeE)expectedTypeInformation);
            memberPrimitiveUnTyped.Read(this);
            memberPrimitiveUnTyped.Dump();

            prs.Init();
            prs.PRvarValue = memberPrimitiveUnTyped.value;

            prs.PRdtTypeCode      = (InternalPrimitiveTypeE)expectedTypeInformation;
            prs.PRdtType          = Converter.ToType(prs.PRdtTypeCode);
            prs.PRparseTypeEnum   = InternalParseTypeE.Member;
            prs.PRmemberValueEnum = InternalMemberValueE.InlineValue;

            if (objectOp.objectTypeEnum == InternalObjectTypeE.Object)
            {
                prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
                prs.PRname           = objectOp.name;
            }
            else
            {
                prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
            }

            objectReader.Parse(prs);
        }
        internal void ReadCrossAppDomainMap()
        {
            SerTrace.Log(this, "ReadObjectWithCrossAppDomainMap");
            BinaryCrossAppDomainMap record = new BinaryCrossAppDomainMap();

            record.Read(this);
            record.Dump();
            Object mapObject = objectReader.CrossAppDomainArray(record.crossAppDomainArrayIndex);
            BinaryObjectWithMap binaryObjectWithMap = mapObject as BinaryObjectWithMap;

            if (binaryObjectWithMap != null)
            {
                binaryObjectWithMap.Dump();
                ReadObjectWithMap(binaryObjectWithMap);
            }
            else
            {
                BinaryObjectWithMapTyped binaryObjectWithMapTyped = mapObject as BinaryObjectWithMapTyped;
                if (binaryObjectWithMapTyped != null)
                {
                    binaryObjectWithMapTyped.Dump();
                    ReadObjectWithMapTyped(binaryObjectWithMapTyped);
                }
                else
                {
                    throw new SerializationException(String.Format(Environment.GetResourceString("Serialization_CrossAppDomainError"), "BinaryObjectMap", mapObject));
                }
            }
        }
        internal void WriteAssembly(String typeFullName, Type type, String assemblyString, int assemId, bool isNew, bool isInteropType)
        {
            SerTrace.Log(this, "WriteAssembly type ", type, ", id ", assemId, ", name ", assemblyString, ", isNew ", isNew);
            //If the file being tested wasn't built as an assembly, then we're going to get null back
            //for the assembly name.  This is very unfortunate.
            InternalWriteItemNull();
            if (assemblyString == null)
            {
                assemblyString = String.Empty;
            }

            if (isNew)
            {
                if (objectWriter.IsCrossAppDomain())
                {
                    if (crossAppDomainAssembly == null)
                    {
                        crossAppDomainAssembly = new BinaryCrossAppDomainAssembly();
                    }
                    crossAppDomainAssembly.Set(assemId, objectWriter.CrossAppDomainArrayAdd(assemblyString));
                    crossAppDomainAssembly.Dump();
                    crossAppDomainAssembly.Write(this);
                }
                else
                {
                    if (binaryAssembly == null)
                    {
                        binaryAssembly = new BinaryAssembly();
                    }
                    binaryAssembly.Set(assemId, assemblyString);
                    binaryAssembly.Dump();
                    binaryAssembly.Write(this);
                }
            }
        }
Exemple #6
0
        private void InitMemberInfo()
        {
            SerTrace.Log(this, objectInfoId, " ", objectType, " InitMemberInfo Entry");

            SerTrace.Log(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];

            // Calculate new arrays
            for (int i = 0; i < count; i++)
            {
                cache.memberNames[i] = cache.memberInfos[i].Name;
                cache.memberTypes[i] = GetMemberType(cache.memberInfos[i]);
                SerTrace.Log(this, objectInfoId, " InitMemberInfo name ", cache.memberNames[i], ", type ", cache.memberTypes[i], ", memberInfoType ", cache.memberInfos[i].GetType());
            }
            cache.fullTypeName   = objectType.FullName;
            cache.assemblyString = objectType.Module.Assembly.FullName;

            isTyped = true;
            isNamed = true;
            SerTrace.Log(this, objectInfoId, " ", objectType, " InitMemberInfo Exit");
        }
Exemple #7
0
        private static int primitiveTypeEnumLength = 17; //Number of PrimitiveTypeEnums

        // The following section are utilities to read and write XML types

        internal static InternalPrimitiveTypeE ToCode(Type type)
        {
            SerTrace.Log("Converter", "ToCode Type Entry ", type);
            InternalPrimitiveTypeE code;

            if ((object)type != null && !type.IsPrimitive)
            {
                if (Object.ReferenceEquals(type, typeofDateTime))
                {
                    code = InternalPrimitiveTypeE.DateTime;
                }
                else if (Object.ReferenceEquals(type, typeofTimeSpan))
                {
                    code = InternalPrimitiveTypeE.TimeSpan;
                }
                else if (Object.ReferenceEquals(type, typeofDecimal))
                {
                    code = InternalPrimitiveTypeE.Decimal;
                }
                else
                {
                    code = InternalPrimitiveTypeE.Invalid;
                }
            }
            else
            {
                code = ToPrimitiveTypeEnum(Type.GetTypeCode(type));
            }

            SerTrace.Log("Converter", "ToCode Exit ", ((Enum)code).ToString());
            return(code);
        }
        private void ReadMemberReference()
        {
            SerTrace.Log(this, "ReadMemberReference ");

            if (memberReference == null)
            {
                memberReference = new MemberReference();
            }
            memberReference.Read(this);
            memberReference.Dump();

            ObjectProgress objectOp = (ObjectProgress)stack.Peek();

            prs.Init();
            prs.PRidRef           = objectReader.GetId((long)memberReference.idRef);
            prs.PRparseTypeEnum   = InternalParseTypeE.Member;
            prs.PRmemberValueEnum = InternalMemberValueE.Reference;

            if (objectOp.objectTypeEnum == InternalObjectTypeE.Object)
            {
                prs.PRmemberTypeEnum = InternalMemberTypeE.Field;
                prs.PRname           = objectOp.name;
                prs.PRdtType         = objectOp.dtType;
            }
            else
            {
                prs.PRmemberTypeEnum = InternalMemberTypeE.Item;
            }


            objectReader.Parse(prs);
        }
Exemple #9
0
 private void InitNoMembers()
 {
     SerTrace.Log(this, objectInfoId, " ", objectType, " InitMemberInfo new cache");
     cache = new SerObjectInfoCache();
     cache.fullTypeName   = objectType.FullName;
     cache.assemblyString = objectType.Module.Assembly.FullName;
 }
Exemple #10
0
        // Get the ObjectType for a memberName
        internal Type GetType(String name)
        {
            SerTrace.Log(this, objectInfoId, " ", objectType, " GetType Entry ", name);
            Type type     = null;
            int  position = Position(name);

            if (position == -1)
            {
                return(null);
            }

            if (isTyped)
            {
                type = cache.memberTypes[position];
            }
            else
            {
                type = (Type)memberTypesList[position];
            }

            if (type == null)
            {
                throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Serialization_ISerializableTypes"), objectType + " " + name));
            }

            SerTrace.Log(this, objectInfoId, " ", objectType, " GetType Exit ", type);
            return(type);
        }
Exemple #11
0
 private void DumpMemberInfo()
 {
     for (int i = 0; i < cache.memberInfos.Length; i++)
     {
         SerTrace.Log(this, objectInfoId, " Constructor 1 memberInfos data ", cache.memberInfos[i].Name, " ", memberData[i]);
     }
 }
Exemple #12
0
        // Read Constructor
        internal void Init(Type objectType, String[] memberNames, Type[] memberTypes, ISurrogateSelector surrogateSelector, StreamingContext context, ObjectManager objectManager, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, bool bSimpleAssembly)
        {
            SerTrace.Log(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;
            this.bSimpleAssembly    = bSimpleAssembly;
            if (memberNames != null)
            {
                isNamed = true;
            }
            if (memberTypes != null)
            {
                isTyped = true;
            }

            if (objectType != null)
            {
                InitReadConstructor(objectType, surrogateSelector, context);
            }
        }
Exemple #13
0
        // Get the memberInfo for a memberName
        internal MemberInfo GetMemberInfo(String name)
        {
            SerTrace.Log(this, objectInfoId, " ", objectType, " GetMemberInfo Entry ", name);
            if (cache == null)
            {
                return(null);
            }
            if (isSi)
            {
                throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Serialization_MemberInfo"), objectType + " " + name));
            }
            if (cache.memberInfos == null)
            {
                throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Serialization_NoMemberInfo"), objectType + " " + name));
            }
            int position = Position(name);

            if (position != -1)
            {
                return(cache.memberInfos[Position(name)]);
            }
            else
            {
                return(null);
            }
        }
Exemple #14
0
 private void DumpPopulate(MemberInfo[] memberInfos, Object[] memberData)
 {
     for (int i = 0; i < memberInfos.Length; i++)
     {
         SerTrace.Log(this, objectInfoId, " ", objectType, " PopulateObjectMembers ", memberInfos[i].Name, " ", memberData[i]);
     }
 }
        internal void ReadAssembly(BinaryHeaderEnum binaryHeaderEnum)
        {
            SerTrace.Log(this, "ReadAssembly");
            BinaryAssembly record = new BinaryAssembly();

            if (binaryHeaderEnum == BinaryHeaderEnum.CrossAppDomainAssembly)
            {
                BinaryCrossAppDomainAssembly crossAppDomainAssembly = new BinaryCrossAppDomainAssembly();
                crossAppDomainAssembly.Read(this);
                crossAppDomainAssembly.Dump();
                record.assemId        = crossAppDomainAssembly.assemId;
                record.assemblyString = objectReader.CrossAppDomainArray(crossAppDomainAssembly.assemblyIndex) as String;
                if (record.assemblyString == null)
                {
                    throw new SerializationException(String.Format(Environment.GetResourceString("Serialization_CrossAppDomainError"), "String", crossAppDomainAssembly.assemblyIndex));
                }
            }
            else
            {
                record.Read(this);
                record.Dump();
            }

            AssemIdToAssemblyTable[record.assemId] = new BinaryAssemblyInfo(record.assemblyString);
        }
Exemple #16
0
        // Specifies the position in the memberNames array of this name

        private int Position(String name)
        {
            SerTrace.Log(this, objectInfoId, " Position ", lastPosition, " ", name);
            if (cache.memberNames[lastPosition].Equals(name))
            {
                return(lastPosition);
            }
            else if ((++lastPosition < cache.memberNames.Length) && (cache.memberNames[lastPosition].Equals(name)))
            {
                return(lastPosition);
            }
            else
            {
                // Search for name
                SerTrace.Log(this, objectInfoId, " Position miss search for name " + name);
                for (int i = 0; i < cache.memberNames.Length; i++)
                {
                    if (cache.memberNames[i].Equals(name))
                    {
                        lastPosition = i;
                        return(lastPosition);
                    }
                }

                throw new SerializationException(String.Format(Environment.GetResourceString("Serialization_Position"), objectType + " " + name));
            }
        }
 internal ValueFixup(Array arrayObj, int[] indexMap)
 {
     SerTrace.Log(this, "Array Constructor ", arrayObj);
     valueFixupEnum = ValueFixupEnum.Array;
     this.arrayObj  = arrayObj;
     this.indexMap  = indexMap;
 }
 internal ValueFixup(Object memberObject, String memberName, ReadObjectInfo objectInfo)
 {
     SerTrace.Log(this, "Member Constructor ", memberObject);
     valueFixupEnum    = ValueFixupEnum.Member;
     this.memberObject = memberObject;
     this.memberName   = memberName;
     this.objectInfo   = objectInfo;
 }
 internal void Dump()
 {
     for (int i = 0; i < Count(); i++)
     {
         Object obj = objects[i];
         SerTrace.Log(this, "Stack Dump ", stackId, " " + ((obj is ITrace)?((ITrace)obj).Trace():""));
     }
 }
Exemple #20
0
        private void InitSiWrite()
        {
            SerTrace.Log(this, objectInfoId, " InitSiWrite Entry ");

            SerializationInfoEnumerator siEnum = null;

            isSi   = true;
            siEnum = si.GetEnumerator();
            int infoLength = 0;

            infoLength = si.MemberCount;

            int count = infoLength;

            // For ISerializable cache cannot be saved because each object instance can have different values
            // BinaryWriter only puts the map on the wire if the ISerializable map cannot be reused.
            TypeInformation typeInformation      = null;
            string          fullTypeName         = si.FullTypeName;
            string          assemblyString       = si.AssemblyName;
            bool            hasTypeForwardedFrom = false;

            if (!si.IsFullTypeNameSetExplicit)
            {
                typeInformation      = BinaryFormatter.GetTypeInformation(si.ObjectType);
                fullTypeName         = typeInformation.FullTypeName;
                hasTypeForwardedFrom = typeInformation.HasTypeForwardedFrom;
            }

            if (!si.IsAssemblyNameSetExplicit)
            {
                if (typeInformation == null)
                {
                    typeInformation = BinaryFormatter.GetTypeInformation(si.ObjectType);
                }
                assemblyString       = typeInformation.AssemblyString;
                hasTypeForwardedFrom = typeInformation.HasTypeForwardedFrom;
            }

            cache = new SerObjectInfoCache(fullTypeName, assemblyString, hasTypeForwardedFrom);

            cache.memberNames = new String[count];
            cache.memberTypes = new Type[count];
            memberData        = new Object[count];

            siEnum = si.GetEnumerator();
            for (int i = 0; siEnum.MoveNext(); i++)
            {
                cache.memberNames[i] = siEnum.Name;
                cache.memberTypes[i] = siEnum.ObjectType;
                memberData[i]        = siEnum.Value;
                SerTrace.Log(this, objectInfoId + " ", objectType, " InitSiWrite ", cache.memberNames[i], " Type ", cache.memberTypes[i], " data ", memberData[i]);
            }

            isNamed = true;
            isTyped = false;

            SerTrace.Log(this, objectInfoId, " InitSiWrite Exit ");
        }
        private int nullCount = 0; //Count of consecutive array nulls

        // Constructor
        internal __BinaryWriter(Stream sout, ObjectWriter objectWriter, FormatterTypeStyle formatterTypeStyle)
        {
            SerTrace.Log(this, "BinaryWriter ");
            this.sout = sout;
            this.formatterTypeStyle = formatterTypeStyle;
            this.objectWriter       = objectWriter;
            m_nestedObjectCount     = 0;
            dataWriter = new BinaryWriter(sout, Encoding.UTF8);
        }
 // Gets the second entry in the stack.
 internal Object PeekPeek()
 {
     if (top < 1)
     {
         return(null);
     }
     SerTrace.Log(this, "PeekPeek ", stackId, " ", ((objects[top - 1] is ITrace)?((ITrace)objects[top - 1]).Trace():""));
     return(objects[top - 1]);
 }
 // Push the object onto the stack
 internal void Push(Object obj)
 {
     SerTrace.Log(this, "Push ", stackId, " ", ((obj is ITrace)?((ITrace)obj).Trace():""));
     if (top == (objects.Length - 1))
     {
         IncreaseCapacity();
     }
     objects[++top] = obj;
 }
Exemple #24
0
        // Return the member Types in order of memberNames
        internal Type[] GetMemberTypes(String[] inMemberNames)
        {
            if (isSi)
            {
                throw new SerializationException(String.Format(Environment.GetResourceString("Serialization_ISerializableTypes"), objectType));
            }

            BCLDebug.Assert(cache != null, "[ReadObjectInfo::GetMemberTypes] cache!=null");

            if (cache.memberTypes == null)
            {
                cache.memberTypes = new Type[count];
                for (int i = 0; i < count; i++)
                {
                    cache.memberTypes[i] = GetMemberType(cache.memberInfos[i]);
                }
            }

            if (inMemberNames.Length != cache.memberInfos.Length && !bSimpleAssembly)
            {
                throw new SerializationException(Environment.GetResourceString("Serialization_WrongNumberOfMembers",
                                                                               objectType, cache.memberInfos.Length, inMemberNames.Length));
            }

            Type[] outMemberTypes = new Type[inMemberNames.Length];

            bool isFound = false;

            for (int i = 0; i < inMemberNames.Length; i++)
            {
                if (inMemberNames[i].Equals(cache.memberInfos[i].Name))
                {
                    outMemberTypes[i] = cache.memberTypes[i];
                }
                else
                {
                    // MemberNames on wire in different order then memberInfos returned by reflection
                    isFound = false;
                    for (int j = 0; j < cache.memberInfos.Length; j++)
                    {
                        if (inMemberNames[i].Equals(cache.memberInfos[j].Name))
                        {
                            outMemberTypes[i] = cache.memberTypes[j];
                            SerTrace.Log(this, objectInfoId, " ", objectType, " GetMemberTypes memberName ", inMemberNames[i], " ", i, " memberTypes ", outMemberTypes[j], " ", j);
                            isFound = true;
                            break;
                        }
                    }
                    if (!isFound)
                    {
                        throw new SerializationException(String.Format(Environment.GetResourceString("Serialization_Position"), objectType));
                    }
                }
            }
            return(outMemberTypes);
        }
Exemple #25
0
 private void InitNoMembers()
 {
     cache = (SerObjectInfoCache)serObjectInfoInit.seenBeforeTable[objectType];
     if (cache == null)
     {
         SerTrace.Log(this, objectInfoId, " ", objectType, " InitMemberInfo new cache");
         cache = new SerObjectInfoCache(objectType);
         serObjectInfoInit.seenBeforeTable.Add(objectType, cache);
     }
 }
Exemple #26
0
        // Returns a COM runtime type associated with the type  code

        internal static Type ToType(InternalPrimitiveTypeE code)
        {
            SerTrace.Log("Converter", "ToType Entry ", ((Enum)code).ToString());
            if (typeA == null)
            {
                InitTypeA();
            }
            SerTrace.Log("Converter", "ToType Exit ", (((object)typeA[(int)code] == null)?"null ":typeA[(int)code].Name));
            return(typeA[(int)code]);
        }
Exemple #27
0
        // Fills in the values for an object
        internal void PopulateObjectMembers(Object obj, Object[] memberData)
        {
            SerTrace.Log(this, objectInfoId, " ", objectType, " PopulateObjectMembers  isSi ", isSi);
            if (!isSi && memberData != null)
            {
                DumpPopulate(cache.memberInfos, memberData);

                FormatterServices.PopulateObjectMembers(obj, cache.memberInfos, memberData);
            }
        }
        // Binary Stream Record Reads
        internal void ReadSerializationHeaderRecord()
        {
            SerTrace.Log(this, "ReadSerializationHeaderRecord");
            SerializationHeaderRecord record = new SerializationHeaderRecord();

            record.Read(this);
            record.Dump();
            this.topId    = (record.topId > 0 ? objectReader.GetId(record.topId) : record.topId);
            this.headerId = (record.headerId > 0 ? objectReader.GetId(record.headerId) : record.headerId);
        }
Exemple #29
0
        // Write constructor
        internal void InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter)
        {
            SerTrace.Log(this, objectInfoId, " Constructor 1 ", obj);
            this.context           = context;
            this.obj               = obj;
            this.serObjectInfoInit = serObjectInfoInit;
            ISurrogateSelector surrogateSelectorTemp;

            if (RemotingServices.IsTransparentProxy(obj))
            {
                objectType = Converter.typeofMarshalByRefObject;
            }
            else
            {
                objectType = obj.GetType();
            }

            if (objectType.IsArray)
            {
                isArray = true;
                InitNoMembers();
                return;
            }

            SerTrace.Log(this, objectInfoId, " Constructor 1 trace 2");

            objectWriter.ObjectManager.RegisterObject(obj);
            if (surrogateSelector != null && (serializationSurrogate = surrogateSelector.GetSurrogate(objectType, context, out surrogateSelectorTemp)) != null)
            {
                SerTrace.Log(this, objectInfoId, " Constructor 1 trace 3");
                si = new SerializationInfo(objectType, converter);
                if (!objectType.IsPrimitive)
                {
                    serializationSurrogate.GetObjectData(obj, si, context);
                }
                InitSiWrite();
            }
            else if (obj is ISerializable)
            {
                if (!objectType.IsSerializable)
                {
                    throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Serialization_NonSerType"),
                                                                   objectType.FullName, objectType.Assembly.FullName));
                }
                si = new SerializationInfo(objectType, converter);
                ((ISerializable)obj).GetObjectData(si, context);
                SerTrace.Log(this, objectInfoId, " Constructor 1 trace 4 ISerializable " + objectType);
                InitSiWrite();
            }
            else
            {
                SerTrace.Log(this, objectInfoId, " Constructor 1 trace 5");
                InitMemberInfo();
            }
        }
Exemple #30
0
        // Gets the object on the top of the stack
        internal Object Peek()
        {
            if (top < 0)
            {
                return(null);
            }
#if _DEBUG
            SerTrace.Log(this, "Peek ", stackId, " ", ((objects[top] is ITrace)?((ITrace)objects[top]).Trace():""));
#endif
            return(objects[top]);
        }